现代 Javascript 教程:类型转换
严格相等(===)
全等操作,不会做任何的类型转换
-
非 Number 类型:类型相等,值相等,则这两个被比较的值相等
-
Number 类型:都不是 NaN,并且数值相同,则这两个被比较的值相等
-
+0 等于 -0
-
NaN 不等于 NaN
-
非严格相等(==)
-
比较前将两个被比较的值转换为相同类型,最终的比较方式等同于全等操作符 === 的比较方式
-
当对不同类型的值进行比较时,JavaScript 会首先将其转化为数字(number)再判定大小
number 类型转换规则:
值 变成…… undefined
NaN
null
0
true 和 false
1
and0
string
去掉首尾空格后的纯数字字符串中含有的数字。如果剩余字符串为空,则转换结果为 0
。否则,将会从剩余字符串中“读取”数字。当类型转换出现 error 时返回NaN
。alert( Number(" 123 ") ); // 123 alert( Number("123z") ); // NaN(从字符串“读取”数字,读到 "z" 时出现错误) alert( Number(true) ); // 1 alert( Number(false) ); // 0
同值相等(Object.is)
Object.is()
方法判断两个值是否为同一个值,不做类型转换,如果满足以下任意条件则两个值相等:
-
都是 undefined
-
都是 null
-
都是
true
或都是false
-
都是相同长度、相同字符、按相同顺序排列的字符串
-
都是相同对象(意味着都是同一个对象的值引用)
-
都是数字且(+0 不等于 -0;NaN 等于 NaN)
// Case 1: Evaluation result is the same as using ===
Object.is(25, 25); // true
Object.is('foo', 'foo'); // true
Object.is('foo', 'bar'); // false
Object.is(null, null); // true
Object.is(undefined, undefined); // true
Object.is(window, window); // true
Object.is([], []); // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo); // true
Object.is(foo, bar); // false
// Case 2: Signed zero
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(-0, -0); // true
Object.is(0n, -0n); // true BigInt类型
// Case 3: NaN
Object.is(NaN, 0/0); // true
Object.is(NaN, Number.NaN) // true
零值相等
与同值相等类似,不过会认为 +0 与 -0 相等。