JavaScript 的嚴格相等運算子 (===) 乍看之下很簡單,但有些情況可能會讓你困惑。讓我們探討為什麼 1 === 1
回傳 true
,而 {} === {}
回傳 false
。
要理解這種行為,你需要了解 JavaScript 如何在記憶體中處理原始值和物件。
原始值包括數字、字串、布林值、undefined
、null
和符號。當使用 ===
比較兩個原始值時,JavaScript 檢查它們的值是否相同。由於 1 === 1
中的兩個 1
指的是相同的值,因此比較結果為 true
。
物件則更為複雜。它們儲存在記憶體中的一個特殊區域,稱為堆。每次創建物件時,它都會在堆中獲得一個新的記憶體位置。當你使用 ===
比較物件時,JavaScript 檢查這兩個物件是否引用相同的記憶體位置。由於 {}
和 {}
是在記憶體中建立的兩個不同的對象,它們不共享相同的記憶體位置,因此 {} === {}
的結果為 false
。
以下是簡化的示意圖:
<code class="language-javascript">const obj1 = {}; // 在内存位置 A 创建 const obj2 = {}; // 在内存位置 B 创建 console.log(obj1 === obj2); // false,因为 A !== B const obj3 = obj1; // obj3 指向与 obj1 相同的位置 console.log(obj1 === obj3); // true,因为两者都指向 A</code>
這種差異是因為物件是引用型別,這表示比較檢查的是引用是否相同,而不是內容。
typeof
檢查值類型JavaScript 中的 typeof
運算子可以幫助你理解值的型別。以下是它的使用方法:
<code class="language-javascript">console.log(typeof "hello"); // "string" console.log(typeof 42); // "number" console.log(typeof true); // "boolean" console.log(typeof undefined);// "undefined" console.log(typeof null); // "object" (已知的 bug!) console.log(typeof {}); // "object" console.log(typeof []); // "object" console.log(typeof function () {}); // "function"</code>
null
和陣列是物件你可能會注意到一些奇怪的地方:typeof null
回傳 "object"。這是 JavaScript 中的歷史錯誤,無法修復,否則會破壞 Web。然而,數組和函數在底層確實是物件。
函數確實是對象,但它們具有一個獨特的屬性:[[Call]]
。這個內部屬性使它們可以被調用,這就是為什麼你可以像這樣調用它們:
<code class="language-javascript">function greet() { console.log("Hello!"); } greet(); // "Hello!"</code>
理解原始值和物件之間的差異對於編寫健全的 JavaScript 程式碼至關重要。當比較物件時,如果要比較它們的內容,請使用深度相等性檢查。例如:
<code class="language-javascript">const objA = { name: "Alice" }; const objB = { name: "Alice" }; // 浅比较 console.log(objA === objB); // false // 深度比较 const isEqual = JSON.stringify(objA) === JSON.stringify(objB); console.log(isEqual); // true</code>
關鍵在於 1 === 1
回傳 true
是因為原始值以值比較,而 {} === {}
回傳 false
是因為物件按引用比較。掌握了這一點,你就能更能理解 JavaScript 的特性和複雜之處!
以上是為什麼 == 為 true 但 {} === {} 為 false。的詳細內容。更多資訊請關注PHP中文網其他相關文章!