前言
初学者会觉得操作符的知识很简单,但是随着学习的深入会发现很多语句都可以用操作符来简化,所以深入理解操作符可以帮助你写出高性能的代码。这篇文章主要记录不同操作符所遵循的规则。
javascript的操作符有一元操作符、位操作符、布尔操作符、乘性操作符、加性操作符、关系操作符、相等操作符、条件操作符、赋值操作符。其中值得注意的是,一元操作符和相等操作符都有可能改变操作数的数值类型。js中的操作符的不同之处在于,它们能够适用于很多值,例如字符串、数字值、布尔值、甚至对象。不过在应用于对象时,相应的操作符都会调用对象的valueOf()方法或者toString()方法来转换成可以操作的数据类型。
一元操作符
递增操作符 ++
递减操作符 --
正数 +
负数 -
递增和递减操作符遵循的规则.
1.在应用于包含有效数字的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
2.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
3.在应用于布尔值false/true时,先将其转换为0再执行加减1的操作。布尔值变量变为数值变量。
4.在应用于浮点数值时,执行加减1的操作。
5.在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值,然后对该值应用前面的四条规则。如果结果是NaN,则在调用toSring()方法后再应用前面的规则。对象变量变成数值变量。
var num = 1;
++num; //2
var num ='12s';
++num; //NaN
typeof num; //number
var num = false;
++num; //1
typeof num; //number
位操作符
位操作符用于最基本的层次上,我们一般比较少用到。ECMAscript中所有数值都以IEEE-754 64位格式存储,但是位操作符并不直接操作64位的值,而是先将64位转换成32位的整数,然后执行操作,最后将结果转换回64位。这会带来一个严重的副效应,即在对特殊的NaN和Infinity值应用位操作时,两个值都会被当做0来处理。
按位非 ~
按位与 &
按位或 |
按位异或 ^
左移 <<
有符号右移 >>
无符号右移 >>>
布尔操作
布尔操作的重要性不言而喻。布尔操作用来测试两个值的关系,如果没有它们,那么如if...else
这类的判断语句也就无用武之地了。
逻辑非 !
逻辑与 &&
逻辑或 ||
逻辑非(!)
只操作1个操作数,无论操作数是什么数据类型,都返回一个布尔值。逻辑非操作不会改变操作数的数据类型。
逻辑非(!)操作符的规则:
1.如果操作数是一个对象,则返回false。
2.日字旁操作数是一个空字符串,则返回true。
3.如果操作数是一个非空字符串,则返回false。
4.如果操作数值是0,则返回true。
5.如果操作数是任意非0数值(包括Infinity),返回false。
6.如果操作数是null,返回true。
7.如果操作数是NaN,返回true。
8.如果操作数是undefined,返回true。
逻辑与(&&)
逻辑与有两个操作数,它可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。
逻辑与(&&)操作符的规则
1.如果第一个操作数是对象,则返回第二个操作数。
2.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时才返回这个对象。
3.如果两个操作数都是对象,则返回第二个操作数。
4.如果有一个操作数时null,则返回null。
5.如果有一个操作数时undefined,则返回undefined。
可见逻辑与是一种短路操作,如果第一个操作数能够决定结果(如null,undefined),那么就不会对第二个操作数求值。
var a = {};
var b;
a && b; //undefined
var a = 3;
var b = {};
a && b; //b
var a = null;
var b = {};
a && b; //null
逻辑或(||)
逻辑或的操作数有两个,如果其中有一个操作数不是布尔值,逻辑或也不一定返回布尔值,它遵循的规则如下:
1.如果第一个操作数是对象,则返回第一个操作数;
2.如果第一个操作数求值结果为false,则返回第二个操作数;
3.如果两个操作数都为对象,则返回第一个操作数;
4.如果两个操作数都是null,则返回null;
5.如果两个操作数都是NaN,则返回NaN;
6.如果连个操作数都是undefined,则返回undefined。
可见逻辑或也是一种短路语句,如果第一个操作数的求值结果为true则不会对第二个操作数进行求值。
注意:由以上规则可知,逻辑操作符均不会改变操作数的数据类型。
利用逻辑与来避免为变量赋null或者undefined的值,如下:
var myObject = preferObject || backupObject;
乘性操作符
乘性操作符和其他语言中的乘性操作符用法类似,只不过在操作数为非数值的情况下会执行自动的类型转换。即参与乘性计算的某个操作数不是数值,会先使用Number()转型函数将其转换为数值。但是乘性操作不会改变操作数数值类型。
乘法(*)
除法(/)
求模(%)
var a = 1;
var b = false;
a*b; //0
typeof b; //boolean
加性操作符
加性操作符在操作数都为数值的时候执行常规的加减法操作,在为非数值时会有特殊的转化规则。但是同乘性操作符一样加性操作符不会改变数值类型。
加法(+)
减法(-)
加性操作符
加性操作符在有操作数为字符串时遵循以下规则:
1.如果两个操作数都为字符,则将第二个操作数与第一个操作数拼接起来;
2.如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来;
减性操作符
1.如果有一个操作数是字符串,布尔值、null或者undefined,则先调用Number()方法,然后再根据数值减法规则执行减法计算。
2.如果有一个操作数是对象,则调用对象的valueOf()方法取得该对象的数值。如果对象没有valueOf()方法方法,则调用tostring()方法并将得到的字符串转换为数值。
关系操作符
小于(<)
大于(>)
小于等于(<=)
大于等于(>=)
相等操作符
相等(==)
不相等(!=)
全等(===)
不全等(!==)
相等和不相等
这组操作符是先转换再比较,即操作符会改变操作数的数值类型。
1.如果有一个操作数是布尔值,则在比较之前会转换为数值;
2.一个操作数是字符,另一个是数值,那么在比较相等性之前会将字符串转换为数值再进行比较;
3.如果一个操作符是对象,另一个不是,则调用valueOf()方法,将得到的结果进行比较。
4.如果两个都是对象,则比较是否是同一个对象,如果两个操作数都指向同一个对象,那么认为它们相等。
var a = '3';
var b = 3;
a == b; //true
typeof a; //number
var a = {};
var b = {};
a == b; //false
var a = {};
var b = a;
var c = a;
b == c; //true
全等和不全等
全等和不全等操作符不会改变操作数的数值类型。
条件操作符
value = boolean_expression ? true_value : false_value
条件操作符会根据boolean_expression的求值结果来决定给变量value赋哪个值,求值为真是赋true_value值,为假时赋false_value值。
赋值操作符
赋值(=)
乘/赋值(*=)
初/赋值(/=)
模/赋值(%=)
加/赋值(+=)
减/赋值(-=)
左移/赋值(<<=)
无符号右移/赋值(>>>=)
有符号右移/赋值(>>=)
逗号操作符
逗号操作符用于在一条语句中执行多个操作。
var num1=1, num2=2, num3=3;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。