操作符:用于操作数据值。包括算术操作符、伪操作符、关系操作符、相等操作符
1. 一元操作符
只能操作一个值的操作符叫一元操作符。
1.1 递增和递减操作符
- 前置型,变量的值是在语句被求值以前改变的。即先计算自己的递增或递减运算。
- 后置型,变量的值是在语句被求值以后改变的。即后计算自己的递增或递减运算。
1
2
3
4
5var num1=2;
var num2=20;
var num3=--num1+num2; //等于21
var num3=num-- +num2; //等于22
<!--var num4=num1+num2; //等于21-->
适用于任何值,整数、字符串、布尔值、对象、浮点值。规则如下例:
1 | var s1="2"; |
1.2 一元加或减操作符
一元加操作符(+)对数值无任何影响;对非数值则会像Number()对这个值执行转换。
1 | var s1="01"; |
一元减操作符(-)用于数值时,该值会变成负数;应用于非数值时,和(+)规则相同,最后再将数值变成负数。
1 | var num=25; |
2. 位操作符
- 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。
- 正数以纯二进制格式存储。
- 负数以二进制补码格式存储。3个步骤。
- 非数值应用位操作符,会先使用Number()将该值转换成一个数值,再进行位操作。
- 7个位操作符
- 按位非,~表示;
- 按位与,&表示;
- 按位或,|表示;
- 按位异或,^表示;
- 左移,<<表示;
- 有符号的右移,>>表示;
- 无符号的右移,>>>表示;
3. 布尔操作符
3个:非(NOT)、与(AND)、或(OR)
3.1 逻辑非(!)
先将其操作数转换为一个布尔值,再对其求反。
1 | alert(!false); //true |
同时使用两个逻辑非操作符(!!)会模拟Boolean()函数的行为。可理解为负负得正。
1 | alert(!!"blue"); //true |
3.2 逻辑与(&&)
&&是一个短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。即第一个操作数是false,则不会对第二个操作数求值,结果就是false。
真值表如下:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
遵循的规则:短路操作。第一个操作数求值遇false就停止,求值遇true则继续对第二个操作数求值并返回第二个
- 如果第一个操作数是对象,则返回第二个操作数
- 如果第二个操作数的对象,则只有在第一个操作数的求值结果为true其情况下才返回该对象
- 如果两个操作数都是对象,则返回第二个操作数
- 如果第一个操作数是null,则返回null
- 如果第一个操作数是NaN,则返回NaN
- 如果第一个操作数是undefined,则返回undefined
3.3 逻辑或(||)
||是一个短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。即第一个操作数是true,则不会对第二个操作数求值,结果就是true。
||可以用来避免为变量赋null和undefined值。
遵循规则:短路操作。第一个操作数求值遇true则停止,遇false则继续对第二个操作数求值并返回第二个
- 如果第一个操作数的是对象,则返回第一个操作数
- 如果第一个操作数的求值是false,则返回第二个操作数
- 如果两个操作数是对象,则返回第一个操作数
- 如果两个操作数都是null,则返回null
- 如果两个操作数都是NaN,则返回NaN
- 如果两个操作数都是undefined,则返回undefined
4.乘性操作符
ECMAScript定义3个乘性操作符:乘法(*)、除法(/)、求模(%)。操作数为非数值时会用Number()函数转换。
5.加性操作符
加法(+)、减法(-),也会在后台转换数据类型,不过不是用Number(),转换规则更复杂。
加法的特殊规则是–>toString()转换再字符串拼接
1 | var result1=5+5 //结果是10 |
减法的特殊规则是–>Number()转换再数值相减
1 | var result1=5-true; //4 |
6.关系操作符
- 奇怪的规则:
- 两个操作数都是字符串,则比较其对应的字符编码
- 有一个操作数是数值,则另一个也转换成数值
- NaN与任何操作数比较都是false.
1
2
3var result="23"<"3"; //true
var result="23"<3; //false
var result="a"<3; //false
7.相等操作符
相等(==)和不相等(!=)–>先转换再比较
全等(===)和不全等–>仅比较不转换
=== 操作符是等于操作符,但是当其中有一个操作数为对象时,行为就不同了。
1
2
3
4
5{} === {}; // false
new String('foo') === 'foo'; // false
new Number(10) === 10; // false
var foo = {};
foo === foo; // true这里等于操作符比较的不是值是否相等,而是是否属于同一个身份;也就是说,只有对象的同一个实例才被认为是相等的。 这有点像 Python 中的 is 和 C 中的指针比较。
推荐使用全等和不全等
8.条件操作符
1 | variable=booolean_expression?true_value:false_value; |