那些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
原文地址:https://www.cnblogs.com/papajia/p/4514189.html