JavaScript:==vs ===運算符
簡介
比較運算符用於邏輯語句中,以確定兩個變量或對像是否相等 通過一些已經設置或自定義的標準。如果推導出兩個變量或對象相等 運算符返回 true
, 和 false
如果不是。
JavaScript 中的比較運算符有:
<
- 小於>
- 大於<=
- 小於或等於>=
- 大於或等於==
和===
- 等於(鬆散和嚴格的相等運算符)!=
和!==
- 不等於(鬆散嚴格的不等式運算符)
JavaScript 很有趣,因為它有兩個視覺上非常相似,但實際上非常不同的相等比較運算符:==
和 ===
.
在本文中,我們將解釋鬆散相等運算符和嚴格相等運算符之間的區別,並介紹它們的一些用法示例。
JavaScript 中的鬆散等式運算符 (==)
JavaScript 中的雙等號正在測試 鬆散等式 .這允許 JavaScript 引擎嘗試將這些表達式轉換為通用類型。這意味著表達式不一定需要是相同的類型。
將值從一種類型轉換為另一種類型的過程稱為類型強制 .類型強制可以是顯式的 和隱式 .
顯式類型強制,顧名思義,由程序員在代碼中顯式完成,使用 JavaScript 提供的內置方法(Number()
, String()
, Boolean()
...)。
例如:
// This would result in x being a number 42
let x = Number("42");
// Similarly,this would result in y being cast to the boolean value false
let y = Boolean(0);
另一方面,隱式類型強制是由 JavaScript 隱式完成的。這種強制類型通常在我們對不同類型使用運算符時完成,但可以通過其中一種進行合理的“匹配”,例如:
// x is going to be cast to the string "1".
let x = 1 + "";
為了解釋這個例子,讓我們從 JavaScript 引擎的角度來看它:
綜上所述,JavaScript 引擎嘗試將這兩個值都轉換為支持+
的類型 運算符,在這種情況下是一個字符串。
/* In this case, the JS engine deduces that both the operands and the result have to be cast to an integer because it's the only type that has a defined subtraction operation (-) */
let y = "5" - "2";
// Because booleans don't have a + operation, the JS engine converts both true values into 1's
let z = true + true;
現在,==
正是這種類型的強制 運算符用於檢查是否相等。讓我們看一下 Node REPL 中使用鬆散相等運算符的一些示例:
> 42 == "42"
true
> "42" == '42'
true
42
, "42"
和 '42'
都匹配到相同的數據類型,並且都鬆散相等,返回 true
在比較中。
布爾值遵循相同的原則:
> true == 1
true
> true + true == 2
true
> false == 0
true
> false + true == 1
true
true
是 1
和 false
是 0
.我們可以通過相加將它們隱式轉換為整數。
最後,這是一個(不可讀)但在語法上有效的比較示例:
免費電子書:Git Essentials
查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!
> ("42" == '42') + (42 == "42") == 2
true
"42" == '42'
被評估為 true
,以及 42 == "42"
.因此,表達式的這一側也計算為 true + true
, 隱式轉換為 1+1
.這顯然是 ==
到 2
,所以表達式返回 true
.
JavaScript 中的假值比較
一個假的 value 是一個變量,計算結果為 false
.在 JavaScript 中,有七個 falsy 值 - false
, 0
, ""
, []
, null
, undefined
, NaN
.
在 falsy 上使用雙等號運算符時有幾個簡單的規則 價值觀:
false
,0
和""
是等價的undefined
和null
返回true
當與自己或彼此相比時,false
與其他任何事物相比NaN
與任何東西相比(甚至是另一個NaN
) 返回false
所以,這些都是 true
:
> false == 0;
true
> false == "";
true
> 0 == "";
true
> undefined == null;
true
> undefined == undefined;
true
> null == null;
true
> [] == false;
true
> [] == 0;
true
雖然這些都是 false
:
> undefined == false;
false
> 0 == null;
false
> null == true
false
> NaN == false;
false
> NaN == NaN;
false
JavaScript 中的嚴格等式運算符 (===)
JavaScript 中的三等號代表嚴格相等 .這意味著,與我們之前討論的鬆散相等運算符不同,它沒有隱式轉換。意味著輸出不會是 true
除非 類型 和價值觀 兩個表達式匹配。它們不再在類型上匹配。
現在,讓我們看一些嚴格相等運算符的示例:
> true === true
true
> true === 1
false
> false === 0
false
此示例生成 true
在第一種情況下,因為 type (布爾值)和 值 (true
) 相等。在其他兩種情況下,它返回 false
,因為儘管值相同,但類型不匹配。我們將布爾值與整數進行比較。
> 42 === 42
true
> 42 === "42"
false
在這裡,第一個示例中的數字和值都相等,導致 true
,而第二個示例中的值和類型不匹配,導致 false
.
結論
在本文中,我們解釋了鬆散相等運算符之間的區別 和嚴格相等 JavaScript 中的運算符 .
我們還解釋了類型強制 是,以及顯式和隱式類型強制的概念。
您可能已經註意到,當我們在 JavaScript 中使用鬆散相等運算符時發生的隱式類型強制是非常不可預測的,這是違反直覺的。這就是為什麼,如果你對 JavaScript 不是很熟悉,在檢查兩個表達式是否相等時,通常最好堅持使用嚴格的相等運算符。
通過使用嚴格相等運算符,您可以同時測試類型和值,因此可以確保始終執行真正的相等測試。