– 记下一些关于运算符的小技巧或容易出错的地方
%运算符
取余运算符运算结果的正负号由第一个运算子的正负号决定,比如:
1 2 |
1 -1 % 2 // -1 2 1 % -2 // 1 |
所以有时候对负数取余会出现错误,使用绝对值函数可以避免错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 会出错 function isOdd(n) { return n % 2 === 1; } isOdd(-5) // false isOdd(-4) // false // 正确了 function isOdd(n) { return Math.abs(n % 2) === 1; } isOdd(-5) // true isOdd(-4) // false |
+运算符
+运算符与其他运算符不太一样,我们知道它可以用来连接字符串操作,是因为用+运算符的时候它通常会将其他类型的值转为字符串,但是除了它比如说-运算符等都会将其他类型的值转换为数值,像这样:
1 2 3 |
var now = new Date(); typeof (now + 1) // "string" typeof (now - 1) // "number" |
当运算子中出现对象的时候:
1 2 3 4 |
1 + [1,2] // "11,2" 1 + {a:1} // "1[object Object]" |
则先调用该对象的valueOf方法。如果返回结果为原始类型的值,则转换为字符串;否则继续调用该对象的toString方法,然后转换为字符串。
但是:
1 2 3 4 |
{a:1} + 1 // 1 ({a:1})+1 "[object Object]1" |
这是为什么呢?此时{a:1}被当做了代码块处理,而这个代码块没有返回值,所以整个表达式就返回1了。但是放在了圆括号中的{a:1},因为js预期()中是一个值,所以它就又被当做对象处理了。
**特殊表达式:**
1. 空数组+空数组
先调用valueOf()返回空数组本身,再调用toString(),返回空字符串。
1 2 |
[] + [] // "" |
2. 空数组+空对象
[]得到”,{}得到”[object Object]”
1 2 |
[] + {} // "[object Object]" |
3. 空对象+空数组
{}被视作代码块省略,+[]就是将[]转换为数值的意思了得到0.
1 2 |
{} + [] // 0 |
4. 空对象+空对象
同样{}被当做代码块省略了,+{}转数值得到NaN
lass="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 13px !important; line-height: 15px !important;">
{} + {}
// NaN
|