1,逻辑与操作可以应用于任何类型的操作数,但不仅仅是布尔值。在有一个操作数不是布尔值得情况下,逻辑与操作就不一定返回布尔值;此时,遵循下列规则:
a,如果第一个操作数是对象,则返回第二个操作数。
b,如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象。
c,如果两个操作数都是对象,则返回第二个操作数。
d,如果有一个操作数是null,则返回null。
e,如果有一个操作数是NaN,则返回NaN。
f,如果有一个操作数是undefined,则返回undefined。
逻辑或与逻辑与是类似的规则,返回的逻辑方式不一样而已
2,乘法操作要遵循下列特殊的规则
a,如果操作数超出了数值表示的范围,则返回Infinity或-Infinity。
b,如果有一个操作数为NaN,则结果是NaN。
c,如果Infinity与0相乘,则结果是NaN。
d,如果Infinity与非0数值相乘,则结果是Infinity或-Infinity。
e,如果Infinity与Infinity相乘,结果仍是Infinity。
f,如果有一个操作数不是数值,则在后台调用Number()将其转换成数值,然后再应用上面的规则。
除法规则与乘法类似,可脑补一下规则~~
3,加法操作规则:(见识了JavaScript的脑洞了)
a,如果一个操作数是NaN,则结果是NaN.
b,Infinity +(-Infinity)=NaN。
c,+0 + (-0)=+0.
d,如果操作数中有字符串的话,那么会将另外一个不是字符串的对象或数值以及布尔值转换成字符串进行字符串的拼接。如果两个都是字符串的话,则直接进行拼接。
减法操作规则:
a,无论是正负Infinity减自身结果都为NaN。
b,异号Infinity相减结果为Infinity或-Infinity。
c,-0减-0,结果为+0。
d,如果有一个操作数是字符串、布尔值、null或undefined,则会先在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换结果为NaN,则减法的结果就是NaN。
e,如果有一个操作数是对象,则调用对象的valueOf()方法以取得表示该对象的数值。如果得到的值是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用其toString()方法并将得到的字符串转换为数值。实例:
var result1 = 5-ture;//4
var result2 = NaN-1; //NaN
var result3 = 5-3; //2
var result4 = 5-""; //5
var result5 = 5-"2"; //3
var result6 = 5-null;//5
4,比较大小规则:
a,如果两个操作数都是字符串,则比较两个字符串对应的字符编码值(“B”<”a”)。
b,如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
c,如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,再按照前面的规则进行比较。
d,如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
e,任何操作数与NaN进行关系比较,结果都是false。
5,相等操作符规则:
a,null和undefined是相等的
b,要比较相等性之前,不能讲null和undefined转换成其他任何值。
c,如果有一个操作数是NaN,则相等操作符返回false
d,如果两个操作数都是对象,则比较他们是不是同一个对象。如果两个操作数都指向同一个对象则相等操作符返回true,否则,返回false。
JS种还有全等和不全等的概念,全等表示未经过任何隐式的转换,然后相等