NaN 与任何数字(包括自身)执行加法,他们的结果都是NaN。BigInt,则执行 BigInt 加法。BigInt 而另一方不是,会抛出 TypeError。console.log(1 + 'true'); // '1true'
// 解析:String(1) + 'true' = '1true'
console.log(1 + true); // 2
// 解析:1 + Number(true) = 1 + 1 = 2
console.log(1 + false); // 1
// 解析:1 + Number(false) = 1 + 0 = 1
console.log(1 + undefined); // NaN
// 解析:1+ Number(undefined) = 1 + NaN = NaN
console.log(1 + null); // 1
// 解析:1+ Number(null) = 1 + 0 = 1
console.log(true + true); // 2
// 解析:Number(true) + Number(true) = 1 + 1 = 2
console.log(null + null); // 0
// 解析:Number(null) + Number(null) = 0 + 0 = 0
console.log(undefined + undefined); // NaN
// 解析:Number(undefined) + Number(undefined) = NaN + NaN = NaN
NaN 无法与任何值做比较,他们的比较结果都是falseconsole.log('2' > 10); // false
// 解析:Number('2') > 10 = false
console.log('' > 1); // false
// 解析:Number('') > 1 = 0 > 1 = false
console.log('aaa' > 1); // false
// 解析:Number('aaa') > 1 = NaN > 1 = false
console.log('aaa' < 1); // false
// 解析:Number('aaa') < 1 = NaN < 1 = false
console.log(true < false); // false
// 解析:Number(true) < Number(false)= 1 < 0 = false
console.log(null < undefined); // false
// 解析:Number(null) < Number(undefined)= 0 < NaN = false
console.log('2' > '10');// true
// 解析:'2'.charCodeAt() > '10'.charCodeAt() = 50 > 49 = true
console.log('2'.charCodeAt(),'10'.charCodeAt()); // 50 49
// 'a'.charCodeAt() = 97, 'b'.charCodeAt() = 98
console.log('abc' > 'b'); // false
// 解析:第一位a>b = 97 > 98 = false
console.log('a'.charCodeAt(),'b'.charCodeAt());
console.log('abc' > 'aad'); // true
// 解析:第一位a=a,第二位b>a = 98 > 97 = true
只有
0、NaN、undefined、null、''、false进行 Boolean 转换才为 false!
==会将复杂数据类型[]、{}通过valueOf()、toString()方法,转换成基本数据类型,再进行比较。==会将其他数据类型转换成number,然后再次松散地比较两个操作数。!,将其他数据类型用Boolean()转换,优先级大于==关系运算符console.log([] == 0); // true
// 解析:Number([].valueOf().toString()) == 0 = Number('') == 0 = true
console.log(![] == 0); // true
// 解析:!Boolean([]) == 0 = false == 0 = true
console.log([] == ![]); // true
// 解析:[].valueOf().toString() == false = '' == false = true
console.log([] == []); // false
// 解析:两个[]代表2个不同空间,所以比较结果为 false
console.log({} == !{}); // false
// 解析:{}.valueOf().toString() == false = '[object Object]' == false = false
console.log({} == {}); // false
// 解析:两个{}代表2个不同空间,所以比较结果为 false