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(变量/表达式){ case 值1: 操作1; case 值2: 操作2; break; default: 默认操作; } 注意:①每一个操作后面都跟上一个break,可以防止当一个case满足后,默认将后面的case都执行了 ②case在做比较时,不带有隐式转换 ③default可以省略不写,但是不推荐,因为如果不写,条件都不满足的时候,什么事都不会发生 1.3三元运算/三目运算 语法: 条件?操作1:默认操作;(等同于if...else...true为前false为后操作) 条件1?操作1:条件2?操作2:默认操作(等同于if...else if...else) 注意:①默认操作不能省略,省略之后会报错 ②当操作复杂的时候,不能使用三目运算,因为操作只能有一句话(执行简便操作),如果操作有多句话时,推荐使用switch或者if if和switch相比较: ①、switch...case:优点:执行效率较高,速度快 缺点:必须要知道最后的结果是什么才可以使用 ②、if...else...: 优点:可以做范围判断 缺点:执行效率较低,速度慢
2.循环结构(反复执行【相同】或【相似】的操作) 循环三要素: ①循环条件:开始 - 结束,循环的次数 ②循环体:做的操作 ③循环变量:记录当前在哪一次 注:很多时候也使用死循环 2.1、while循环 语法: let 循环变量=几; while(循环条件){ 循环体; 循环变量变化;(可根据实际情况交换) } 注意:①有时候需要使用死循环:while(true) ②break:退出整个循环 continue:退出本次循环 2.2、for循环 语法: for(var 循环变量=几;循环条件;循环变量变化){ 循环体; } 2.3、do...while循环(基本不会使用这个循环) 语法: var 循环变量=几; do{ 循环体; 循环变量的变化 }while(循环条件) while和for的区别: while和for在原理上没有什么区别,一般在不确定循环次数的时候使用while,确定循环次数的时候使用for(for(;;)为死循环,for(;循环条件)等同于whil循环) 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个为false:0,"",undefined,NaN,null,false,其余全部都是true
4.Function(函数) 4.1、概念:Function 也叫方法,【先预定义】好,以后可以【反复使用】的【代码段】 4.2、使用函数 ①定义/创建/声明: function 函数名(){ 函数体/代码段; } ②调用函数:2种 第一种:在js内部写:函数名(); 第二种:在HTML上面绑定事件:<elem on事件名="函数名()"> ③带参数的函数 首先,创建出带有形参的函数:function 函数名(形参,...){ 函数体/代码段; } 其次,使用带有形参的函数时,必须传入实参:函数名(实参,...) ④自定义函数 第一步:创建 【声明方式】创建函数 function 函数名(形参列表){ 操作; return 返回值/结果; }
【直接量方式】创建函数(不推荐)
var 函数名=function(形参列表){
操作;
return 返回值/结果;
}
【箭头函数】创建函数
let 函数名=() =>{
}(可视情况选择是否加()或者{})
第二步:调用
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则表示当前触发事件元素) 总结:一切的获取,往往都是为了判断