JS中的操作符与其他语言大体上是相似的,这里总结一些需要注意的地方.
一元操作符
- 一元加(+)
在数值前面放置+
对数值没有任何影响,对非数值使用+
,具有Number()
转型函数的效果. - 一元减(-)操作符
应用于数值,该值会变成负数.应用于非数值,会先遵循与+
相同的规则,然后转换为负数
布尔操作符
- 逻辑非(!)
在对非Boolean类型的数据使用逻辑非,会先转换为布尔值,再求反。
所以使用两个!
速度会模拟Boolean()
的行为. - 逻辑与(&&)
在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值,遵循以下规则:
- 第一个是对象,返回第二个操作数
- 第二个是对象,则只有第一个是true时才返回该对象
- 第一个是
null, undefined, NaN
,则返回相应的null, undefined, NaN
- 逻辑或(||)
在有一个操作数不是布尔值的情况下,不一定会返回布尔值,遵循以下规则:
- 第一个是对象,则返回第一个操作数
- 第一个求值结果为false,则返回第二个操作数
- 两个操作数都是
null, undefined, NaN
,则返回相应的null, undefined, NaN
乘性操作符
在操作数不为数值的时候,会执行自动的类型转换.
-
乘法()
除了"遵循NaN参与的任何操作,结果都是NaN"*之外,其他情况大部分都是正常值或者Infinity
或-Infinity
.
只有一种情况: Infinity与0相乘,结果为NaN -
除法(/)
有两种情况是NaN
- 零被零除--> NaN
- Infinity 被 Infinity 除--> NaN
- 取模(%)
- 被除数无穷大而除数有限大,则为NaN
- 被除数无穷大而除数为0,则为NaN
- Infinity被Infinity除,则为NaN
- 被除数有限大而除数无穷大,结果为被除数
- 被除数为0,结果为0
加性操作符
- 加法
- Infinity加-Infinity,结果为NaN
- 有一个是字符串,则另一个数转换为字符串,然后拼接
- 如果有一个操作数是对象或者数值或布尔值,另一个操作数是字符串,则将非字符串转换为字符串,对于undefined和null,使用
String()
转换为字符串
- 减法
- Infinity - Infinity = NaN
- -Infinity - (-Infinity) = NaN
- 有一个操作数是数值,另一个操作数为非数值,则转换为数值.
总结:加法中,如果有一个字符串,则优先将另一个转换为字符串,减法中,如果有一个是数值,则优先将另一个转换为数值
关系操作符
关系操作符有小于(<),大于(>),小于等于(<=)和大于等于(>=),优先比较的数据类型是数值,返回布尔值
- 两个操作数都是数值,则比较数值大小
- 两个操作数都是字符串,则比较第一个字符的编码
- 有一个数值,将另一个转换为数值,进行比较
- 注意:比较时 null转换为0 ,undefined转换为NaN
相等操作符
主要分为相等(==)和全等(===),区别在于相等操作符操作之前会进行类型的转换,全等操作符不会进行类型转换。
相等操作符优先进行数值的比较
- 一个操作数是字符串,另一个是数值,则转换为数值再比较
- 一个是对象,则调用
valueOf()
方法,再比较 - 在比较相等性之前,null和undefined不能转换为其他任何值,而在关系比较时,null会转换为0,undefined会转换为NaN
如下
var a = null;
console.log(a == 0); //false,因为null不能转化为其他
console.log(a >= 0); // true, 因为在关系操作符中,null转换为0
console.log(a <= 0); // true, 因为在关系操作符中,null转换为0
- 在对象的比较中,只有两个操作数指向同一个对象,才会返回true
- 全等(===)操作符则两个操作数必须完全相同才会返回true
条件操作符
就是常见的expression ? true_value : false_value
了
赋值操作符
*=
/=
+=
-=
%=
<<=
>>=
-
>>>=
这些操作符只是简单而已,没有性能上的提升
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作
var num = 1,num2 = 2,num3 = 3;
还可以用于赋值,在用于赋值时,总会返回最后一项
var num = (5,4,3,2,0); // num的值为0
网友评论