搜尋
首頁web前端js教程js中相等判斷===、==、Object.is()的區別

js中相等判斷===、==、Object.is()的區別

相信剛接觸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,今天查完資料後做了一下總結,希望下面的內容能夠對大家有所幫助,如果哪些地方有誤的話,也歡迎大家指正。

【相關課程推薦:##JavaScript影片教學#】 

##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 // false
undefined === undefined // true
null === null   // true
undefined === null  // false

2. 寬鬆相等x == y

1. 如果x,y的型別相同,回傳x===y的結果;2. 如果x是null, y是undefined, 回傳true;

3. 如果x是undefined, y是null, 回傳true;

#4. 如果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'  // true
12 == '12c' // false, 说明ToNumber转换是用的Number()方法

注意:

Number(null) === 0

但是

null == 0 // false,

2.1 ToNumber將一個值轉換為數值類型js中相等判斷===、==、Object.is()的區別1. 如果是boolean類型, true回傳1,false回傳0;

2. 如果是數值,只是簡單的傳入回傳;

3. 如果是null,回傳0

4. 如果是undefined, 回傳NaN;

#5. 如果是字串,字串如果只包含數字,則將其轉換成十進制數;如果是有效的浮點格式,將其轉換成對應的浮點數值;如果是二進位或十六進制將其轉換成對應的十進制數值;

6. 如果是對象,呼叫對象的valueOf()方法,然後依照前面規則轉換,如果valueOf傳回值是NaN,則呼叫toString()方法,再依照前面的規則轉換回傳的字串

2.2 ToPrimitive

toPrimitive(A)透過嘗試呼叫A 的A.toString() 和A.valueOf() 方法,將參數A 轉換為原始值(Primitive);

JS中原始型別有:Number、String、Boolean、Null、Undefined;

不同型別物件的valueOf()方法的傳回值:

物件Array##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或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

3.同值相等

同值相等由 Object.is 方法判断:

● 两个值都是 undefined

● 两个值都是 null

● 两个值都是 true 或者都是 false

● 两个值是由相同个数的字符按照相同的顺序组成的字符串

● 两个值指向同一个对象

● 两个值都是数字并且

    ○ 都是正零 +0,

    ○ 或者都是负零 -0,

    ○ 或者都是 NaN

    ○ 都是除零和 NaN 外的其它同一个数字

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.零值相等

与同值相等类似,不过会认为 +0 与 -0 相等。

小结

=== 不做类型转换,当两边的数类型不相同时,直接返回false;当前类型相同且都是数值类型的时候,有一个是NaN,那么结果就是false, 另外 +0 === -0

==运算符,当两边操作数类不相同时会做隐式转换,然后才进行比较,这样的话就会出现 false == 0, '' == false 等现象, 但是Object.is不会做这种转换

本文来自 js教程 栏目,欢迎学习!  

以上是js中相等判斷===、==、Object.is()的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器