今天群里的小伙伴讨论了一个问题var x = 5; if(x += 1 && x++) console.log(x)//10
反正我开始看到这个是一脸懵逼的
这个问题涉及到了一个基本上都会被忽略掉的操作符优先级问题和一些js中的操作符问题 首先,运算符优先级! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
接下来,系统的回顾一下js操作符吧+
会将各种类型自动转换成number类型~
按位非AND
按位与OR
按位或XOR
按位异或<<
左移>>
有符号的右移 符号位不动 以符号位填充空位>>>
无符号的右移 符号位不动 以0填充空位
###布尔操作符###
- 逻辑非 逻辑非操作符由一个叹号表示(!),可以应用于ECMAScript中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。
- 逻辑与 逻辑与属于短路操作,即如果第一个操作数求值结果是false,那么就不会对第二个操作数求值。
其中一个值不是布尔值时:遵循下列规则 第一个操作数为假,返回第一个; 第一个操作数为真的时候,返回第二个。 如果第一个操作数是对象,则返回第二个操作数 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象 如果两个操作数都是对象,则返回第二操作数 (1)如果有一个操作数是null,则返回null (2)如果有一个操作数是NaN,则返回NaN (3)如果有一个操作数是undefined,则返回undefinded
- 逻辑或 逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
(1)第一个操作数为真,返回第一个
(2)第一个操作数为假,返回第二个
###关系操作符###
如果两个操作数都是数值,则执行数值比较
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
如果一个操作数是数值,则将另一个操作数转换为数值,然后执行数值比较
###相等操作符###
1.相等和不相等
先转换再比较
(1)如果有一个操作数是布尔值,则在比较相等性之前,先将其转换为数值
(2)如果有一个操作数是字符串,另一个操作数是数值,先将其转换为数值
(3)如果有一个操作数是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型值按前面的基本规则进行比较
null和undefined是相等的
要比较相等性之前不能将null和undefined转换为任何其他值
如果两个操作数都是NaN,相等操作符也返回false,按规则,NaN不等于NaN
2.全等和不全等
仅比较而不转换 未经转换就相等则返回true