首發地址:http://www.geeee.top/2019/11/15/equality-comparisons/,轉載請註明出處數組
相信剛接觸JS的人都會被他的想等性判斷給整糊塗,看看下面代碼,你能答對幾個?函數
NaN === NaN // false NaN == NaN // false Object.is(NaN, NaN) // true 0 == false // true 1 == true // true Number(null) === 0 // true null == 0 // false
Javascript提供了三種不一樣的值比較操做,分別是嚴格相等、寬鬆相等、以及Object.is,但願下面的內容可以對你們有所幫助。code
NaN === NaN // false undefined === undefined // true null === null // true undefined === null // false
12 == '0xc' // true, 0xc是16進制 12 == '12' // true 12 == '12c' // false, 說明ToNumber轉換是用的Number()方法
注意:對象
Number(null) === 0 可是 null == 0 // false,
詳情參考數值類型轉換blog
toPrimitive(A)經過嘗試調用 A 的A.toString() 和 A.valueOf() 方法,將參數 A 轉換爲原始值(Primitive);
JS中原始類型有:Number、String、Boolean、Null、Undefined;ip
不一樣類型對象的valueOf()方法的返回值:字符串
對象 | 返回值 |
---|---|
Array | 返回數組對象自己。 |
Boolean | 布爾值 |
Date | 存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC |
Function | 函數自己 |
Number | 數字值 |
Object | 對象自己。這是默認狀況, 能夠覆蓋自定義對象的valueOf方法 |
String | 字符串值 |
// Array:返回數組對象自己 var array = ["ABC", true, 12, -5]; console.log(array.valueOf() === array); // true // Date:當前時間距1970年1月1日午夜的毫秒數 var date = new Date(2013, 7, 18, 23, 11, 59, 230); console.log(date.valueOf()); // 1376838719230 // Number:返回數字值 var num = 15.26540; console.log(num.valueOf()); // 15.2654 // 布爾:返回布爾值true或false var bool = true; console.log(bool.valueOf() === bool); // true // new一個Boolean對象 var newBool = new Boolean(true); // valueOf()返回的是true,二者的值相等 console.log(newBool.valueOf() == newBool); // true // 可是不全等,二者類型不相等,前者是boolean類型,後者是object類型 console.log(newBool.valueOf() === newBool); // false // Function:返回函數自己 function foo(){} console.log( foo.valueOf() === foo ); // true var foo2 = new Function("x", "y", "return x + y;"); console.log( foo2.valueOf() ); /* ƒ anonymous(x,y ) { return x + y; } */ // Object:返回對象自己 var obj = {name: "張三", age: 18}; console.log( obj.valueOf() === obj ); // true // String:返回字符串值 var str = "http://www.xyz.com"; console.log( str.valueOf() === str ); // true // new一個字符串對象 var str2 = new String("http://www.xyz.com"); // 二者的值相等,但不全等,由於類型不一樣,前者爲string類型,後者爲object類型 console.log( str2.valueOf() === str2 ); // false
同值相等由 Object.is 方法判斷:get
Object.is('foo', 'foo'); // true Object.is(window, window); // true Object.is('foo', 'bar'); // false Object.is([], []); // false var foo = { a: 1 }; var bar = { a: 1 }; Object.is(foo, foo); // true Object.is(foo, bar); // false Object.is(null, null); // true Object.is(true, 'true') // false // 特例 Object.is(0, -0); // false Object.is(0, +0); // true Object.is(-0, -0); // true Object.is(NaN, 0/0); // true
與同值相等相似,不過會認爲 +0 與 -0 相等。string