那些JS容易忽略的题
位运算:
按位于(AND) 只在两个数值的对应位都是1时才返回1,任何一位为0,都是0.
var a = 5&2;
parseInt('5').toString(2); // "101"
parseInt('2').toString(2); // "10"
explain:
101
010 = 0
按位非(NOT) 执行按位非得结果就是返回数值的反码。按位非是少数几个与二进制计算有关的操作付之一。
按位非的本质是操作数的负值减1.
var b = ~5 - 2;
explain:
-6 - 2 = -8;
按位或(OR) 有一个位是1的情况下返回1,只有两个位数都是0返回0.
parseInt('5').toString(2); // 101 二进制 parseInt('2').toString(2); // 010 二进制
explain:
101
010 = 111
parseInt('111',2); // 7 十进制
按位异或(XOR) 两个数值对应位上只有一个1时返回1,对应的两位都是1或都是0返回0.
var d = 5 ^ 3;
parseInt('5').toString(2); // 101 二进制 parseInt('3').toString(2); // 011 二进制
explain:
101
011 = 110
parseInt('110',2) // 6 十进制
布尔操作符
逻辑非 应用于ECMAScript中的任何值。无论什么数据类型,都会返回一个布尔值。操作符首先会将操作数转换为一个布尔值,然后求反。
!false // true !NaN // true !null // true
!0 // true !{} // false ![] // false !'qwe' // false !"" // true !" " // false
逻辑与 可以应用于任何类型的操作数,不仅是布尔值。
真值表
第一个操作数 | 第二个操作数 | 结果 |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。
此时遵循规则:
1.如果第一个是对象,则返回第二个操作数。
2.如果第二个是对象,则只在第一个操作数的求值为true时返回该对象。
3.如果两个都是对象,则返回第二个操作数。
4.如果有一个是null,则返回null。
5.如果有一个是NaN,则返回NaN。
6.如果有一个是undefined,则返回undefinded。
属于短路操作,即第一个操作数能够决定结果,就不会再对第二个求值。如果第一个操作数是false,则无论第二个是什么值,结果都不是true。
var a = true; var result = (a&&b); // Uncaught b is not defined 错误未定义,不能在逻辑与中使用未定义的值。
var a = false; var b = true; var result = (a && b); // false
var result2 = (a && c); // false 无论第二个有无定义,第一个false,结果必定是false,不会再对第二个求值。
逻辑或 如果有一个不是布尔值,逻辑或也不一定返回布尔值。
真值表
第一个操作数 | 第二个操作数 | 结果 |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
遵循规则:
1. 如果第一个是对象,则返回第一个操作数。
2. 如果第一个求值结果为false,则返回第二个操作数。
3. 如果两个都是对象,则返回第一个操作数。
4. 如果两个都是null,则返回null。
5. 如果两个都是NaN,则返回NaN。
6. 如果两个都是undefined,则返回undefined。
短路操作符。如果第一个操作数求值结果是true,就不会对第二个求值。
var a = true; // undefined var b = (a || c); // true 第一个true,结果必定是true,不会再对第二个求值。
可以用来避免为变量赋null或undefined值。
var a = a || 0
加减乘除模操作符
乘 *特殊规则 如果有一个不是数字,则后台会调用Number()转换为数值,在计算。
除 *特殊规则 1. 0/0 = NaN。 2. 如果有一个不是数字,则后台会调用Number()转换为数值,在计算。
模 *特殊规则
1. 被除数是无穷大除数是有限大数值,结果NaN。
2.被除数是有限大除数是0,结果NaN。
3. 0%0 = 0。
4.如果有一个不是数字,则后台会调用Number()转换为数值,在计算。
加 *特殊规则
1. 如果两个都是字符串,拼接。
2. 如果有一个是字符串,则将另一个转换为字符串,拼接。
3. 如果有一个是对象、数值或布尔值,则调用toString()方法取得相应字符串值。
4. 对于null和undefined,则分别调用String()函数取得字符串"null"和"undefined"。
null + null // NaN null + undefined // NaN undefined + undefined // NaN {} + null // 0 {abc:"abc"} + null // 0 {abc:"abc"} + 2 // 2
减 *特殊规则 ECMAScript中的减法在各种数据转换需要注意。
1. 如果有一个是NaN,结果NaN。
2. +0 减 +0 结果+0。
3. +0 减 -0 结果-0。
4. -0 减 -0 结果-0。
5. 如果有一个是字符串、布尔值、null或undefined,在后台调用Number()函数转换为数值,在计算。如果转换结果是NaN,则结果NaN。
6. 如果有一个是对象,则调用对象的valueof()方法已取得表示该对象的数值。得到的值是NaN,结果NaN。如果对象没有valueof()方法,则调用toString()方法并将得到的字符串转换为数值。
NaN-1 //NaN NaN-NaN //NaN undefined-1 //NaN undefined-undefined //NaN '123'-'312' //-189 'qwe'-'123' //NaN null-null //0 null-NaN //NaN 5-NaN //NaN null-undefined //NaN
关系操作符
<
>
<=
>=
相等操作符
相等和不相等
全等和不全等
条件,赋值操作符
条件
赋值
Split
[""].length // 1 [].length // 0 ''.split(',').length // 1 ''.split('').length // 0 ''.split('') // [] ''.length // 0