【js 致死点】运算符
2019-02-26 本文已影响0人
南方帅
- 加法运算符
只有加法运算符 在执行的时候有重载。其他都是转换成数值,加法根据前后执行相加、或拼接
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
- 余数(%)运算符 会带符号
-1 % 2 // -1
1 % -2 // 1
// 所以判断一个数 奇偶数的 正确的写法
function isOdd(n) {
return Math.abs(n % 2) === 1;
}
- 数值运算符 指数运算符
指数运算符是右结合 先进行最右边的计算
+true //1
-(-x) //x
2 ** 3 ** 2 // 512
// 相当于 2 ** (3 ** 2)
- 比较运算符
除数值,真值,任意比较 都是通过valueOf().toString()
字符串比较 是根据字典里面排序和unicode 编码
'2' > '123'
'大' < '小' // 中文排序和比较 不适用
和NaN
比较 除了!=
其他都是false
1 > NaN // false
1 <= NaN // false
'1' > NaN // false
'1' <= NaN // false
NaN > NaN // false
NaN <= NaN // false
NaN != NaN // true
undefined和null与自身严格相等
undefined === undefined // true
null === null // true
==
相等运算符。 同类型的 ==
等同于 ===
不同类型会 Number(a) === Number(b)
0 == false // true
// 等同于 0 === Number(false)
'true' == true // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1
!=
是判断相等 然后取反
1 != '1' // false
// 等同于
!(1 == '1')
~
位运算符 对数字取反 只能针对整数部分,可用于取整
~ -3 // 2 3-1 = 2
~3 // -4 -3-1 = -4
~~0.00000003 //0 不同parseInt(0.0000003) // 3
- 结合顺序
一般运算级别相同的都是左结合。
例外:上面提到的 **
指数运算符就是右结合、赋值运算符、三元运算符
w = x = y = z;
q = a ? b : c ? d : e ? f : g;
// 等同于
w = (x = (y = z));
q = a ? b : (c ? d : (e ? f : g));