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...)
条件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的区别:
while和for在原理上没有什么区别,一般在不确定循环次数的时候使用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个为false:0,"",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则表示当前触发事件元素)
总结:一切的获取,往往都是为了判断