您好,登錄后才能下訂單哦!
小編給大家分享一下javascript中相等操作符==與===的區別有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
1.前言
我們在編程的過程中,經常會遇到判斷兩個變量是否相等的情況,ECMAscript提供了兩種相等操作符”==”和”===”來判斷,這兩種操作都會返回一個boolean值。一般來說,我們把”==”稱之為相等,稱”===”為全等。當兩相比較的兩個變量數據類型一致時,情況比較簡單,而當操作符兩邊的變量類型不一致,甚至其中的某個變量是對象時,情況就比較復雜了,下面分別介紹當操作數類型不同時運算結果會怎么樣。
2.全等操作符 “===”
全等操作符”===”的情況相對來說比較簡單。當用全等操作符”===”來判斷時,首先檢查操作符兩邊操作數數據類型是否一致,若不一致,則直接返回false,否則,才進行下一步判斷。如果是兩個boolean的比較,則”===”兩邊必須同為true或同為false,才可以返回true,否則返回false.若兩相比較的是數字,那么只有當這兩個數字大小相等時才會返回true,否則返回false。如果要比較的兩個變量是字符串,先比較兩個字符串的長度length是否相等,如果長度不一樣,則返回false,如果相等,則從兩個變量的第一個字符開始比較是否相等,一直比較到最后一位,如果其中的某一位不想等,則返回false,否則返回true,(注意:字符串的比較是不會忽略空格的,所以在比較兩個字符串是否相等時,為確保安全,應該先去除空格,然后把兩個字符串同轉為大寫或者小寫之后再進行比較)。而null只有在null===null的情況下才會返回true,其它情況都返回false,同樣,undefined只有在undefined===undefined的情況下才會返回true,否則返回false。如:
true === 1 //false "1" === 1 //false //boolean的比較 true === true //true true === false //false //string的比較 "hello" === "helloworrld" //false "hello" === "world" //false "hello" === " hello" //false "hello" === "hellO" //false "hello" === "hello" //true //number的比較 1 === 1 //true 1 === 1.0 //true 1 === 1.2 //false //null和undefined的比較 undefined === undefined //true null === null //true undefined === null //false,兩者在"=="時才返回true
如果進行”===”比較的兩個操作數不是基本類型值,而是兩個對象,這時候判斷依據就是,判斷這兩個變量是否是”同一個”對象
var a,b,c; a = b = { name : '柳輕侯', city : '南京' }; c = { name : '柳輕侯', city : '南京' }; a === b //true a === c //false
兩個對象僅僅”長得一樣”是不夠的,a和c都是Object實例,且兩者擁有相同的屬性和值,可是這兩個卻不是”同一個”對象,因為實際上a和c指向了兩個不同的實例,所以這兩個對象是不全等的。而a和b卻是指向了同一個對象,換個說法,a和b是同一個對象的不同別名,他們實際上指向的對象是完全相同的,所以a === b。”!==” 與 “===” 比較規則一樣,在此不再贅述。
3.相等操作符”==”
全等操作符在進行判斷的時候,如果兩個變量的類型不同,則直接返回false,而與此不同,”==”相等操作符在判斷的時候,如果兩個變量的類型不同,則會做一個隱式的類型轉換,把要比較的兩個值轉化為相同的類型再做比較,那么這種轉化規則是怎么樣的?
在轉化不同數據類型時,相等和不等操作符遵循下面的基本規則
如果其中一個操作數是是boolean值,則在比較之前會先將boolean值轉化為number值,true轉化為1,false轉為0;
如果其中一個操作數是string類型,而另一個是number類型,則在比較之前先將string類型轉化為number類型再進行判斷;
在比較之前,undefined和null是不會轉為其他值進行比較的;
如果其中一個操作數是對象,而另一個是基本類型值,則在比較之前先將對象轉為基本類型值,然后再依據前面的規則進行后續的比較;
兩個操作數在比較時遵循下列規則
undefined和null是相等的,即:undefined == null;
如果有一個操作數是NaN,那么返回false,即使兩個操作數都是NaN,也會返回false;
如果兩個操作數是對象,則比較規則跟”===”的比較規則是一樣的,除非這兩個操作數是同一個對象,則返回true,否則返回false;
此處需要注意的是,NaN == NaN是返回false的,NaN意思是 not a number,也就是說該操作數是一個非數字,這個非數字是不確定的,它的值是未知的,甚至可能根本就不能用javascript的語法表示出來,這樣一個未知量是不能用來進行特定比較的,兩個未知的東西,如果不能確定它的值是什么,當然不能說 NaN == NaN。那么既然不能用”==”來比較,我們怎么去判定一個變量是不是NaN呢 ,既然不能用相等來判定,那么不妨反其道而行之,用”!=”來判定,判定一個變量是否不等于NaN。比如:
//如果需要判定一個變量是不是NaN,可以如下 //a是你需要判定的變量 if((typeof a === "number") && a != NaN ){ //此處需要注意,NaN也是number類型 //TODO }
4.常見比較情況及其結果
null == undefined // true "NaN" == NaN // false 5 == NaN // false NaN == NaN // false NaN != NaN // true false == 0 // true true == 1 // true true == 2 // false undefined == 0 // false null == 0 // false "5" == 5 // true
5.典型例題解析
![] == [] //true
這是一道比較容易令人困惑的題,按照正常的思維模式,對一個操作數邏輯取反,跟這個操作數本身的值是相對的,如果這個操作數本身的值是true,那么取反之后就是false,反之,如果這個操作數的值是false,那么對其邏輯取反之后就是true,無論如何也不會是同一個值,可是事實上卻是![] == []。首先,![]的值是false,因為這里[]被當成了一個數組的實例,是一個對象,而對象都是真值,對其取反,得到一個假值,也就是false。其次看等號右邊,[]是一個對象,要將其轉為基本類型值,會先調用數組的valueOf方法,而數組的valueOf方法返回數組本身,沒有得到一個基本值,這時候要繼續調用數組的toString方法,得到一個””空字符串,所以這時候也就變成了false == “”是否為真的問題了,而根據前面的規則,如果有一個操作數為boolean值,會將其轉為數值,false轉化為0。進而,問題轉化為0 == “”是否為真值的問題,當number和string比較時,會將string轉為number,而””會轉為0。最后,問題變演化成了0 == 0是否為真值,毋庸置疑,結果是true。這里要注意的就是![],它被當成了一個整體的邏輯值,是直接對對象進行取反,是一個假值,而不是先把[]轉化為基本值再取反
6.小結
“==”在比較不同類型值得時候會進行隱式的類型轉化,而”===”不會轉化,全等一定相等,相等卻不一定全等,這是一個充分不必要條件。undefined和null相等而不全等,且在相等比較的時候不會轉化為其他類型的值。NaN是不等于NaN 的,要判斷某個變量是不是NaN,要用”!=”。對象和非對象在進行比較的時候會先轉為基本類型值然后再根據上面的規則進行比較。
看完了這篇文章,相信你對“javascript中相等操作符==與===的區別有哪些”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。