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中文网其他相关文章!