笔记

201 阅读8分钟

1.分支结构

1.1、if...else...

1.1.1、一个条件,一件事,满足就做,不满足就不做

       语法:if(条件){
   	操作;
      }

1.1.2、一个条件,两件事,满足就做第一件事,不满足就做;另外一件事

       语法:if(条件){
	操作;
	}else{
	默认操作;
      }

1.1.3、多个条件,多件事,哪个条件满足就做哪件事

       语法:if(条件1){
	操作1;
	}else if(条件2){
	操作2;
	}else{
	默认操作;
      }
       注意:①else可以省略不写,但是不推荐,因为如果不写,条件都不满足的时候,什么事都不会发生
     ②分支走了一条路之后,就不会再走另外一条路

1.2、switch...case

       语法:
     switch(变量/表达式){
	case1:
	操作1;
	case2:
	操作2;
	break;
	default:
	默认操作;
      }
       注意:①每一个操作后面都跟上一个break,可以防止当一个case满足后,默认将后面的case都执行了
     ②case在做比较时,不带有隐式转换
     ③default可以省略不写,但是不推荐,因为如果不写,条件都不满足的时候,什么事都不会发生

1.3三木运算

       语法:
                  条件?操作1:默认操作;(等同于if...else...)		
      条件1?操作1:条件2?操作2:默认操作(等同于if...else if...else)	
       注意:①默认操作不能省略,省略之后会报错
     ②当操作复杂的时候,不能使用三木运算,因为操作只能有一句话,如果操作有多句话时,推荐使用switch或者if

if和switch相比较:

       ①、switch...case:优点:执行效率较高,速度快
                                    缺点:必须要知道最后的结果是什么才可以使用
       ②、if...else...:      优点:可以做范围判断
                                    缺点:执行效率较低,速度慢

2.循环结构(反复执行【相同】或【相似】的操作)

        循环三要素:
	①循环条件:开始 - 结束,循环的次数
	②循环体:做的操作
	③循环变量:记录当前在哪一次

2.1、while循环

        语法:
                   var 循环变量=几;
       while(循环条件){
       循环体;
       循环变量变化;
       }
        注意:①有时候需要使用死循环:while(true)
      ②break:退出整个循环
         continue:退出本次循环

2.2、for循环

        语法:
      for(var 循环变量=几;循环条件;循环变量变化){
      循环体;
                  }

2.3、do...while循环(基本不会使用这个循环)

        语法:
      var 循环变量=几;
      do{
      循环体;
      循环变量的变化
      }while(循环条件)

while和for的区别:

        whilefor在原理上没有什么区别,一般在不确定循环次数的时候使用while,确定循环次数的时候使用for

while和do...while的区别:

        区别只在第一次,当条件都不满足时,do...while会执行一次,while一次都不执行;但是当条件满足时,两者没有什么区别

3.强制数据类型转换

3.1、转字符串:2种方法

	①var str=x.toString();(x不能是undefined和null,会报错,因为他们不是对象)
	②var str=String(x);(不要手动使用,完全等效于隐式转换,还不如使用+""进行转换)

3.2、转数字:3种方法

parseInt(str/num);(专门用于parse解析为Int整型;执行原理:从左向右依次读取转换每个字符,碰到非数字字符就停止转换)
                            ②parseFloat(str); (专门用于parse解析为Float浮点型;执行原理:几乎和parseInt一致,只认识第一个小数点)
                            ③Number(x);(万能的,但是不推荐使用,因为完全等效于隐式转换,还不如使用-0 *1 /1进行转换)

2.3、转布尔:

	Boolean(x);(万能的,任何人都可以转为布尔,但是绝对不要手动使用,完全等效于隐式转换,还不如 !!x)
    注意:只有6个为false0,"",undefined,NaN,null,false,其余全部都是true

4.Function(函数)

4.1、概念:Function 也叫方法,【先预定义】好,以后可以【反复使用】的【代码段】

4.2、使用函数

    ①定义/创建/声明:
        function 函数名(){
        函数体/代码段;
         }
    ②调用函数:2种
        第一种:在js内部写:函数名(); 
        第二种:在HTML上面绑定事件:<elem onclick="函数名()"></elem>
    ③带参数的函数
         首先,创建出带有形参的函数:function 函数名(形参,...){
		                          函数体/代码段;
			          }
         其次,使用带有形参的函数时,必须传入实参:函数名(实参,...)
    ④自定义函数
        第一步:创建
                          【声明方式】创建函数
	                  function 函数名(形参列表){
			操作;
			return 返回值/结果;
			}

              【直接量方式】创建函数(不推荐)
		  var 函数名=function(形参列表){
		        操作;
		        return 返回值/结果;
		        }
        第二步:调用
                           var 接住返回的结果=函数名(实参列表)

4.3、作用域

         ①全局作用域:全局变量和全局函数
         ②函数作用域:局部变量和局部函数
     特点:优先使用局部的,当局部没有再使用全局,全局没有就会报错
     缺点:当对函数中未声明的变量直接赋值时,会造成全局污染;局部可以使用全局的,但是全局不可以使用局部的,但是可以通过return解决

4.4、声明提前

     在程序执行之前,会将var声明的变量(轻)和function声明的函数(重),集中定义在当前作用域的顶部,但是赋值留在原地
     注意:声明方式创建的函数会完整的提前
   直接量方式创建的函数不会完整提前,只有变量名部分会提前

4.5、重载(相同的函数名,根据传入的实参的不同,自动选择对应的函数去执行)

      固定套路:
①通过下标去获取传入的某一个实参:arguments[i]
②通过length去获取到底传入了几个实参:arguments.length
③通过判断传入的实参的不同,在内部去写判断,从而变相的实现重载

5.数组

5.1、创建数组

            ①直接量方式:var arr=[数据1,...];
②构造函数方式:var arr=new Array(数据1,...);

5.2、获取数组之中的元素

            数组名[i]

5.3、添加或替换元素

            数组名[i]=新数据;(如果下标处没有元素,则为添加,如果下标处有元素,则为替换)
            三个固定套路:
	     ①向末尾添加元素:arr[arr.length]=新数据;
	     ②获取数组的倒数第n个元素:arr[arr.length-n];
	     ③缩容:删除倒数n个元素:arr.length-=n;

5.4、遍历数组

            固定公式:
               for(var i=0;i<arr.length;i++){
               arr[i];//当前次元素
               }

6.DOM(DOM会将页面上的每个元素、属性、文本、注释等等都会视为一个DOM元素/节点/对象)

6.1、查找元素

6.1.1通过HTML特点去查找元素

①通过ID查找元素(一般不适用,留给后端使用) var elem=document.getElementById("id值"); 特殊: Ⅰ、返回值,找到了返回当前找到DOM元素,没找到返回的一个null Ⅱ、如果出现多个相同id,只会找到第一个

②通过class查找元素 var elems=document/已经找到的父元素.getElementsByTagName("标签名"); 特殊: Ⅰ、返回值,找到了返回一个类数组DOM集合,没找到得到空集合 Ⅱ、js只能直接操作DOM元素,不能直接操作DOM集合,解决:要么下标拿到某一个,要么遍历拿到每一个。 Ⅲ、不一定非要从document开始查找,如果从document去找,会找到所有的元素,可以换成我们已经找到的某个父元素

③通过标签查找元素 var elems=document/已经找到的父元素.getElementsByTagName("标签名"); 特殊: Ⅰ、返回值,找到了返回一个类数组DOM集合,没找到得到空集合 Ⅱ、js只能直接操作DOM元素,不能直接操作DOM集合,解决:要么下标拿到某一个,要么遍历拿到每一个。 Ⅲ、不一定非要从document开始查找,如果从document去找,会找到所有的元素,可以换成我们已经找到的某个父元素

6.1.2通过关系去查找元素

                            父元素:elem.parentNode;(单个元素)
	子元素:elem.children; (集合)
	第一个子元素:elem.firstElementChild; (单个元素)
	最后一个子元素:elem.lastElementChild;(单个元素) 
	前一个兄弟:elem.previousElementSibling; (单个元素)
	后一个兄弟:elem.nextElementSibling; (单个元素)

6.2、操作元素(先找到元素,才能操作元素)

6.2.1、内容

                         ① elem.innerHTML (获取和设置开始标签到结束标签之间的内容,支持识别标签)
		获取:elem.innerHTML;
		设置:elem.innerHTML="新内容";

             ② elem.innerText( 获取和设置开始标签到结束标签之间的纯文本,不识别标签)
		获取:elem.innerText;
		设置:elem.innerText="新内容";
             ③ input.value(专门获取/设置input里的内容)
		获取:input.value;
		设置:input.value="新内容";

6.2.2、属性

                         获取属性值:elem.getAttribute("属性名");或者:elem.属性名;
             设置属性值:elem.setAttribute("属性名","属性值");或者:elem.属性名="属性值";
                         简化后的写法缺点:①class必须写为className
                                                       ②不能操作自定义属性

6.2.3、样式

                         获取样式:elem.style.css属性名;
             设置样式:elem.style.css属性名="css属性值";
                         注意:当css属性名有横线时,需要去掉横线,改为小驼峰命名法,例如:border-radius需要改为borderRadius
             绑定时间关键词:this(如果单个元素绑定事件,this就代表这个元素;如果多个元素绑定事件,this则表示当前触发事件元素)
             总结:一切的获取,往往都是为了判断