您好,登錄后才能下訂單哦!
相信剛接觸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提供了三種不同的值比較操作,分別是嚴(yán)格相等、寬松相等、以及Object.is,希望看完下面的內(nèi)容,能夠徹底弄清楚他的判斷邏輯。
1. 嚴(yán)格相等 x === y判斷邏輯
1、如果x的數(shù)據(jù)類型和y的數(shù)據(jù)類型不相同,返回false;
2、如果x是Number類型
3、其他類型參照SameValueNonNumber(x, y)
NaN === NaN // false undefined === undefined // true null === null // true undefined === null // false
2. 寬松相等 x == y
12 == '0xc' // true, 0xc是16進(jìn)制 12 == '12' // true 12 == '12c' // false, 說明ToNumber轉(zhuǎn)換是用的Number()方法
注意:
Number(null) === 0 但是 null == 0 // false,
2.1 ToNumber將一個值轉(zhuǎn)換為數(shù)值類型
詳情參考數(shù)值類型轉(zhuǎn)換
2.2 ToPrimitive
toPrimitive(A)通過嘗試調(diào)用 A 的A.toString() 和 A.valueOf() 方法,將參數(shù) A 轉(zhuǎn)換為原始值(Primitive);
JS中原始類型有:Number、String、Boolean、Null、Undefined;
不同類型對象的valueOf()方法的返回值:
對象 | 返回值 |
---|---|
Array | 返回數(shù)組對象本身。 |
Boolean | 布爾值 |
Date | 存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數(shù) UTC |
Function | 函數(shù)本身 |
Number | 數(shù)字值 |
Object | 對象本身。這是默認(rèn)情況, 可以覆蓋自定義對象的valueOf方法 |
String | 字符串值 |
// Array:返回數(shù)組對象本身 var array = ["ABC", true, 12, -5]; console.log(array.valueOf() === array); // true // Date:當(dāng)前時間距1970年1月1日午夜的毫秒數(shù) var date = new Date(2013, 7, 18, 23, 11, 59, 230); console.log(date.valueOf()); // 1376838719230 // Number:返回數(shù)字值 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:返回函數(shù)本身 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
3.同值相等
同值相等由 Object.is 方法判斷:
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
4.零值相等
與同值相等類似,不過會認(rèn)為 +0 與 -0 相等。
小結(jié)
=== 不做類型轉(zhuǎn)換,當(dāng)兩邊的數(shù)類型不相同時,直接返回false;當(dāng)前類型相同且都是數(shù)值類型的時候,有一個是NaN,那么結(jié)果就是false, 另外 +0 === -0
==運算符,當(dāng)兩邊操作數(shù)類不相同時會做隱式轉(zhuǎn)換,然后才進(jìn)行比較,這樣的話就會出現(xiàn) false == 0, ‘' == false 等現(xiàn)象, 但是Object.is不會做這種轉(zhuǎn)換
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。