您好,登錄后才能下訂單哦!
這篇文章給大家介紹JavaScript中===、==、Object.is()的區(qū)別是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1. 嚴格相等 x === y判斷邏輯
1. 如果x的數據類型和y的數據類型不相同,返回false;
2. 如果x是Number類型
● x是NaN,返回false
● y是NaN,返回false
● x的值和y的值相等,返回true
● x是+0,y是-0,返回true
● x是-0,y是+0,返回true
● 否則返回false
3. 其他類型參照SameValueNonNumber(x, y)
● 斷言:x,y不是Number類型;
● 斷言: x,y的數據類型相同;
● x是undefined, y是undefined return true;
● x是null, y是null,return true;
● x是字符串類型,當且僅當x,y字符序列完全相同時(長度相同,每個位置上的字符也相同)返回true, 否則返回false;
● 如果x是布爾類型,當x,y都為true或者都為false時返回true,否則返回false;
● 如果x是symbol類型,當x,y是相同的symbol值,返回true,否則返回false;
● 如果x,y是同一個對象值,返回true,否則返回false;
NaN === NaN // falseundefined === undefined // truenull === null // trueundefined === null // false
2. 寬松相等 x == y
1. 如果x,y的類型相同,返回x===y的結果;
2. 如果x是null, y是undefined, 返回true;
3. 如果x是undefined, y是null, 返回true;
4. 如果x是數值,y是字符串, 返回x == ToNumber(y);
5. 如果x是字符串,y是數值, 返回ToNumber(x) == y;
6. 如果x是布爾類型, 返回ToNumber(x)==y 的結果;
7. 如果y是布爾類型,返回 x==ToNumber(y) 的結果;
8. 如果x是String或Number或Symbol中的一種并且Type(y)是Object,返回 x==ToPrimitive(y) 的結果
9. 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一種,返回 ToPrimitive(x)==y 的結果
10. 其他返回false
12 == '0xc' // true, 0xc是16進制12 == '12' // true12 == '12c' // false, 說明ToNumber轉換是用的Number()方法
注意:
Number(null) === 0
但是
null == 0 // false,
2.1 ToNumber將一個值轉換為數值類型
1. 如果是boolean類型, true返回1,false返回0;
2. 如果是數值,只是簡單的傳入返回;
3. 如果是null,返回0
4. 如果是undefined, 返回NaN;
5. 如果是字符串,字符串如果只包含數字,則將其轉換成十進制數;如果是有效的浮點格式,將其轉換成對應的浮點數值;如果是二進制或十六進制將其轉換成對應的十進制數值;
6. 如果是對象,調用對象的valueOf()方法,然后依照前面規(guī)則轉換,如果valueOf返回值是NaN,則調用toString()方法,再依照前面的規(guī)則轉換返回的字符串
2.2 ToPrimitive
toPrimitive(A)通過嘗試調用 A 的A.toString() 和 A.valueOf() 方法,將參數 A 轉換為原始值(Primitive);
JS中原始類型有:Number、String、Boolean、Null、Undefined;
不同類型對象的valueOf()方法的返回值:
Array返回數組對象本身。Boolean布爾值Date存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTCFunction函數本身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或falsevar 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 ); // truevar 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 方法判斷:
● 兩個值都是 undefined
● 兩個值都是 null
● 兩個值都是 true 或者都是 false
● 兩個值是由相同個數的字符按照相同的順序組成的字符串
● 兩個值指向同一個對象
● 兩個值都是數字并且
○ 都是正零 +0,
○ 或者都是負零 -0,
○ 或者都是 NaN
○ 都是除零和 NaN 外的其它同一個數字
Object.is('foo', 'foo'); // trueObject.is(window, window); // trueObject.is('foo', 'bar'); // falseObject.is([], []); // falsevar foo = { a: 1 };var bar = { a: 1 };Object.is(foo, foo); // trueObject.is(foo, bar); // falseObject.is(null, null); // trueObject.is(true, 'true') // false// 特例Object.is(0, -0); // falseObject.is(0, +0); // trueObject.is(-0, -0); // trueObject.is(NaN, 0/0); // true
4.零值相等
與同值相等類似,不過會認為 +0 與 -0 相等。
小結
=== 不做類型轉換,當兩邊的數類型不相同時,直接返回false;當前類型相同且都是數值類型的時候,有一個是NaN,那么結果就是false, 另外 +0 === -0
==運算符,當兩邊操作數類不相同時會做隱式轉換,然后才進行比較,這樣的話就會出現(xiàn) false == 0, '' == false 等現(xiàn)象, 但是Object.is不會做這種轉換
對象 | 返回值 |
---|
關于JavaScript中===、==、Object.is()的區(qū)別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。