js中==和===的區別以及總結
學習js時我們會遇到 == 和 === 兩種符號,現做總結如下
兩種符號的定義
"==" 叫做相等運算子
"===" 叫做嚴格相等運算子(全等運算子)
它們之間的區別
"==" 只判斷等號兩邊的值是否相等,而不判斷型別是否相同。值相同則返回 true
"===" 既要判斷值是否相等,也要判斷型別是否相同,即全等才能返回 true
總結:
(分析 ==)
先把等號兩側的值轉化為基本資料型別,如果兩側的值基本資料型別不同,轉化為數字再進行比較,如果相同,直接比較
1、undefined 和 null 互相比較返回 true,和自身比較也返回 true,其他情況返回 false
2、Infinity 只和自身比較返回 true
3、NaN,{} 和任意值比較都是返回 false
4、如果其中一個值是 true,則將其轉換為 1 再進行比較。如果其中一個值是 false,則將其轉換為 0 再進行比較
5、要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值
6、 如果一個值是數字,另一個是字串,先將字串轉換為數值,然後使用轉換後的值進行比較
7、如果等號兩側都是物件,則比較它們是否為同一個物件。如果指向同一個物件,則返回 true,否則返回 false
較為複雜的情況:
8、如果等號一側是Number,String,Boolean這三種型別中的一種,而另一側是物件型別時, 則對物件執行ToPrimitive操作(這步是JS直譯器執行的,ToPrimitive方法的實現,正是依次去呼叫物件的valueOf,toString方法,直到其中一個方法返回一個基本值,然後比較返回的基本值和另一側那三中型別的值。如果這兩個方法沒有返回基本值 ,那就認定不相等 )
(分析 ===)
1、先分析是否為相同型別,如果型別不同直接返回 false,
如果型別相同,
基本型別,直接比較值是否相同,
物件型別,由於物件型別儲存的是物件(包括陣列,函式)的地址值,所以地址值不同的,返回的都是 false。地址值相同,返回 true
上面說的有些抽象,下面我們來結合具體的例項來分析一下
== 詳解(有隱式轉換)
一、等號兩側是基本資料型別,且型別不同時
1. 字串與數字比較 (等號兩側轉化為數字,再比較)
100 == "100" ==> 100 == 100 // true
100 == "99" ==> 100 == 99 // false
100 == "abc" ==> 100 == NaN // false
1 == "abc" ==> 1 == NaN // false
1 == "" ==> 1 == 0 // false
2.字串與布林值比較(等號兩側轉換為數字,再比較)
"abc" == true ==> NaN == 1 // false
"abc" == false ==> NaN == 0 // false
"" == true ==> 0 == 1 // false
"" == false ==> 0 == 0 // true
3.數字與布林值比較(等號兩側轉換為數字,再比較)
1 == true ==> 1 == 1 // true
0 == true ==> 0 == 1 // false
100 == true ==> 100 == 1 // false
1 == false ==> 1 == 0 // false
0 == false ==> 0 == 0 // true
100 == false ==> 100 == 0 // false
4. undefined 和 null
undefined 與 null 比較特殊 要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值
undefined 和 null 互相比較返回 true,和自身比較也返回 true,其他情況返回 false
undefiend == undefined // true
undefined == null // true
null == null // true
undefined == 其他值 // false
null == 其他值 // false
5. NaN
NaN(非數值)也很特殊,NaN 和任何值(包括自己)比較都是返回 false
NaN == NaN // false
NaN == 其他值 // false
二、等號兩側有複雜資料型別(引用型別)時,且型別不同時
(特殊:{} 和任何值比較返回都是false )
1.等號兩側都為引用型別時
(由於引用型別儲存的是物件(包括陣列,函式)的地址值,所以地址值不同的,返回的都是 false)
等號兩側為相同的引用資料型別時
例項
[1,2] == [1,2] // false
[1,2] == [2,3] // false
{x:1} == {x:1} // false
{x:1} == {y:1} // false
等號兩側為不同的引用資料型別時
例項
[1,2] == {y:1} // false
2.有且只有一側為引用資料型別時
例項
[1,2] == 1 ==> NaN == 1 // false
[1,2] == true ==> NaN == 1 // false
[ 1 ] == 1 ==> 1 == 1 // true
[1] == '1' ==> '1' == '1' // true
[] == 0 ==> 0 == 0 // true
[] == '0' ==> '' == '0' // false
[] == '' ==> '' == '' // true
{x:1} == 1 ==> NaN == 1 // false
{x:1} == '1' ==> NaN == 1 // false
true == {x:1} ==> 1 == NaN // false
=== 詳解(無隱式轉換)
例項
100 == "100" // false
100 == 100 // true
"100" == "100" // true
{x:1} == {y:1} // false