一、运算符(操作符)
1.1. 算术运算符
算术运算符: 加(+)、减(-)、乘(*)、除(/)、取模(%)
1.2. 赋值运算符
简单的赋值操作符由等于号(=)表示,其作用就是把右侧的值赋给左侧的变量。
每个主要算术操作符都有对应的复合赋值操作符。
乘/赋值(*=);
除/赋值(/=);
模/赋值(%=);
加/赋值(+=);
减/赋值(-=);
1.3. 一元运算符
只能操作一个值的操作符叫做一元操作符。一元操作符是ECMAScript中最简单的操作符。
前置型
++a:先自增,后使用。
–a:后自减,先使用。
后置型
a–:先使用,后自减。
a++:先使用,后自增。
递增和递减操作符遵循下列规则:
- 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设为NaN。字符串变量变成数值变量。
- 在应用于布尔值false时,先将其转化为0再执行加减1的操作。布尔值变量变成数值变量。
- 在应用于布尔值true时,先将其转化为1再执行加减1的操作。布尔值变量变成数值变量。
- 在应用于浮点数值时,执行加减1操作。
- 在应用于对象时,先调用对象的valueof()方法以取得一个可供操作的值。然后对该值应用前述规则。
1.4. 布尔运算符
1.4.1 逻辑与
逻辑与操作符由两个和号(&&)表示,有两个操作数。
真值表如下所示:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。
此时,它遵循下列规则:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一操作数的求值结果为true的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果第一个操作数为null,则返回null;
- 如果第一个操作数是NaN,则返回NaN;
- 如果第一个操作数是undefined,则返回undefined。
逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。对于逻辑与而言,如果第一个操作数是false,则无论第二个操作数是什么值,结果都不在可能是true。
1.4.2 逻辑或
逻辑或操作符由两个竖线符号(||)表示,有两个操作数。
逻辑或的真值表如下所示:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值。此时,它遵循下列规则:
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果为false,则返回第二个操作数;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果第一个操作数为null,则返回null;
- 如果第一个操作数是NaN,则返回NaN;
- 如果第一个操作数是undefined,则返回undefined。
逻辑或也是短路操作符。如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
1.4.3 逻辑非
逻辑非操作符由一个叹号(!)表示,可以应用于ECMAScript中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后将对其求反。
逻辑非操作符遵循下列规则:
- 如果操作数是一个对象,返回false;
- 如果操作数是一个空字符串,返回true;
- 如果操作数是一个非空字符串,返回false;
- 如果操作数是数值0,返回true;
- 如果操作数是任意非0数值,返回false;
- 如果操作数是null,返回true;
- 如果操作数是NaN,返回true;
- 如果操作数是undefined,返回true。
逻辑非操作符也可以用于将一个值转换为与其对应的布尔值。而同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为。
1.5. 比较运算符
大于(>)小于( <)大于等于( >=)小于等于( <=) 这几个操作符用于对两个值进行比较,比较运算符返回的结果是布尔值。
- 与ECMAScript中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换或完成某些奇怪的操作。以下就是相应的规则:
- 如果两个操作数都是数值,则执行数值比较。
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值(ASCII码或者汉字unicode编码)。
- 如果一个操作数是数值,则将另外一个操作数转换为一个数值,然后执行数值比较。
- 如果一个操作数是对象,则调用这个对象的valueof()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueof()方法,则调用toString()方法。
- 如果一个操作数是布尔值,则现将其转换为数值,然后再执行比较。
- 任何操作数与NaN进行关系比较,结果都是false。
1.6. 相等运算符
1.6.1. 相等和不相等
ECMAScript中的相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true。
而不相等操作符由叹号后跟等于号(!=)表示,如果两个操作数不相等,则返回false。
这两个操作符都会先强制转换,然后再比较它们的相等性。在转换不同的数据类型时,遵循下列基本规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,true转换为1;
- 如果有一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
- 如果一个操作数是对象,另一个操作数是不是,则调用对象valueof()方法,用得到的基本类型值按照前面的规则进行比较;
- null和undefined是相等的;
- 如果有一个操作数是NaN,则相等操作符返回false,不相等操作符返回true;
- 即使两个操作数都是NaN,相等操作符也返回false;
1.6.2. 全等和不全等
全等操作符由3个等于号(===)表示,它只在两个操作数未经转换就相等的情况下返回true。
不全等操作符由一个叹号后跟两个等于号(!==)表示,它在两个操作数未经转换就不相等的情况下返回true。
1.7. 条件运算符
条件运算符:条件?语句1 : 语句2
当条件为真执行语句1,否则执行语句2。
1.8. 运算符的优先级
优先级从高到底
1. () 优先级最高
2. 一元运算符 ++ – !
3. 算数运算符 先* / % 后 + -
4. 关系运算符 > >= < <=
5. 相等运算符 == != === !==
6. 逻辑运算符 先&& 后||
7. 条件运算符
8. 赋值运算符
二、语句
2.1. 顺序语句
所谓顺序结构程序就是指按语句出现的先后顺序执行的程序结构,是结构化程序中最简单的结构。
编程语言并不提供专门的控制流语句来表达顺序控制结构,而是用程序语句的自然排列顺序来表达。计算机按此顺序逐条执行语句,当一条语句执行完毕,控制自动转到下一条语句。
2.2. 分支语句
分支结构又称为选择结构。当程序执行到控制分支的语句时,首先判断条件,根据条件表达式的值选择相应的语句执行(放弃另一部分语句的执行)。
if语句
单分支结构
if(条件表达式){
当条件为真,执行这个代码;
}
两路分支结构
if(条件){
当条件为真,执行这个代码;
}else{
当条件为假,执行这个代码;
}
多路分支结构
if (条件1) {
条件1为真的时候执行的代码块
} else if (条件2) {
条件1为假的时候并且条件2为真的时候执行的代码块
} else if (条件N) {
上述条件都不满足并且条件N满足的时候执行的代码块
} else {
上述条件都不满足的时候执行的代码 安全出口
}
switch语句
switch(n)
{
case 1:
执行代码块 1
break;
case 2:
执行代码块 2
break;
default:
n 与 case 1 和 case 2 不同时执行的代码
}
switch语句中的每一种情形(case)的含义是:如果表达式等于这个值,则执行后面的语句。
而break关键字会导致到吗执行流跳出switch语句。如果省略break关键字,会导致执行完当前case后,继续执行下一个case。
最后的default关键字则用于在表达式不匹配前面任何一种情形的时候,执行代码。
注意:
1. switch case语句不能完全替代if else
2. switch case比较的值全等 ===
3. switch case一般需要配合break关键字使用 没有break会造成case穿透
2.3. 循环语句
2.3.1. while循环语句
while语句属于前测试循环语句,在循环体内的代码被执行之前,就会对出口条件求值。因此循环体内的代码有可能永远不会被执行。
while(条件){
//条件为真时会不断执行这个代码
//直到while的条件为假
}
2.3.2. do-while循环语句
do while语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。换句话说,在对条件表达式求值之前,循环体内的代码至少会被执行一次。
do{
// 循环语句
}while(true)
2.3.3. for循环语句
for语句也是一种前测试循环语句。但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。
语法:
for (语句 1; 语句 2; 语句 3)
{
被执行的代码块
}
//语句 1 初始化语句,用来初始化变量
//语句 2 循环(代码块)的条件
//语句 3 在循环(代码块)已被执行之后执行
2.4 调试断点
断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。
调试步骤:
浏览器中按F12==-->sources-->找到需要调试的文件-->在程序的某一行设置断点
调试中的相关操作:
Watch:监视,通过watch可以监视变量的值的变化,非常的常用。
F10:程序单步执行,让程序一行一行的执行,这个时候,观察watch中变量的值的变化。
F8:跳到下一个断点处,如果后面没有断点了,则程序执行结束。
2.5 break和continue语句
break和continue语句用于在循环中精确地控制代码的执行。break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。
for (var i = 1; i <= 10; i++) {
if( i == 5) {
// 跳出整个循环 break后面的代码不会运行 同时整个循环结束
break;
}
console.log(i);
continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代。
if( i == 5) {
// 跳出当前循环 continue后面的代码不会运行 会直接进行到下一次的循环
continue;
}
console.log(i);
}