0%

Javascript 中 == vs. ===

最近看了一些CODE 發現大家在寫js判斷時都會寫===,而不是==,所以查了一下這兩者的差別。

比較運算式

== :較不嚴謹,只比較「值」。比較時會先進行型別的轉換,再比較裡面的值。
===:嚴謹模式,較嚴謹,會比較「型別」與「值」。會先比較型別,如果不相符就會回傳false,不比較值。

一般變數

以下面這個例子來說,使用==進行比較時會先將numstr轉換成一致的型態。
因此,比較時會是一致的。

1
2
3
4
5
6
7
// 基本型別 (ex. int string)
var num = 3;
var str = '3';
console.log(num == str);
//return true
console.log(num === str);
//return false

不過這時,如果是boolean時,’true’與true 會是不相等的

1
2
3
4
5
6
var isOK = true;
var result = 'true';
console.log(isOK == result);
//return false
console.log(isOK === result);
//return false

true 會自動轉型別為 1
false 會自動轉型別為 0
當使用 === 會發現型別不一致,所以回傳false

1
2
3
4
5
6
7
//Boolean test2
var isOK = true;
var result = 1;
console.log(isOK == result);
//return true
console.log(isOK === result);
//return false

Null & undefined 的比較

1
2
3
4
5
6
7
// Null & undefined 
var test;
var test2 = null;
console.log(test == test2);
//return true
console.log(test === test2);
//return false

物件

當比較的型別為「Object」時,是比較是否指向同一個記憶體位置。
為什麼是比較記憶體位置呢?
這就牽扯到JS 中Pass by value, or Pass by reference,裡面描述當變數的值是原生型別 (Primitive) 時,行為是 Pass by value,
原生型別包含:String、NumberBoolean、Undefined、Null。

當變數的值是物件型別 (Object) 時,行為是 Pass by reference
在 JavaScript 中的物件型別常見的例如:Array、Object

當兩個物件指向不同位址時,等式不會成立。

1
2
3
4
5
6
7
8
var objA = {'name':'roi'};
var objB = {'name':'roi'};
console.log(objA == objB);
//return false
console.log(objA === objB);
//return false
console.log(objA == {'name':'roi'});
//return false

當兩個物件指向同個位址時,等式會成立

1
2
3
4
5
6
var objA = {'name':'roi'};
var objB = objA;
console.log(objA == objB);
//return true
console.log(objA === objB);
//return true

上面的code,可以改改這邊的code 來觀察改變。

總結

到底要用== 還是 ===呢?
以Null & undefined為例,當你的result 進行了一連串的運算,但中間出了錯誤導致回傳undefined而不是null。但如果你要拿這個判斷來執行後續的行為的話就可能會產生錯誤。

1
2
3
4
5
6
7
var result = undefined;
if(result == null){
console.log("相符1"); //會输出
}
if(result === null){
console.log("相符2"); //不會输出
}

為了避免發生類似這樣的錯誤,建議盡量使用嚴謹的===進行比較。

參考資料:

  1. [Javascript] 等於的運用 — ==和 ===的不同之處
  2. JS/JavaScript中两个等号 == 和 三个等号 === 的区别
  3. 你不可不知的 JavaScript 二三事#Day26:程式界的哈姆雷特 — — Pass by value, or Pass by reference?
  4. Null & undefined 型態差