最近看了一些CODE 發現大家在寫js判斷時都會寫===,而不是==,所以查了一下這兩者的差別。
比較運算式
== :較不嚴謹,只比較「值」。比較時會先進行型別的轉換,再比較裡面的值。
===:嚴謹模式,較嚴謹,會比較「型別」與「值」。會先比較型別,如果不相符就會回傳false
,不比較值。
一般變數
以下面這個例子來說,使用==進行比較時會先將num
與str
轉換成一致的型態。
因此,比較時會是一致的。
1 | // 基本型別 (ex. int string) |
不過這時,如果是boolean時,’true’與true 會是不相等的
1 | var isOK = true; |
true
會自動轉型別為 1false
會自動轉型別為 0
當使用 === 會發現型別不一致,所以回傳false
1 | //Boolean test2 |
Null & undefined 的比較
1 | // Null & undefined |
物件
當比較的型別為「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 | var objA = {'name':'roi'}; |
當兩個物件指向同個位址時,等式會成立
1 | var objA = {'name':'roi'}; |
上面的code,可以改改這邊的code 來觀察改變。
總結
到底要用== 還是 ===呢?
以Null & undefined為例,當你的result
進行了一連串的運算,但中間出了錯誤導致回傳undefined而不是null。但如果你要拿這個判斷來執行後續的行為的話就可能會產生錯誤。
1 | var result = undefined; |
為了避免發生類似這樣的錯誤,建議盡量使用嚴謹的===進行比較。