JavaScript 的严格相等运算符 (===) 乍看简单,却暗藏玄机。本文将解释为何 1 === 1 为真,而 {} === {} 为假。
数据类型:基元与对象
理解这一差异的关键在于 JavaScript 如何处理基元类型和对象类型。
基元类型: 包括数字、字符串、布尔值、undefined、null 和 Symbol。使用 === 比较基元时,JavaScript 直接比较其值。1 === 1 为真,因为它们的值相同。
对象类型: 对象存储在堆内存中。每次创建对象,都会分配新的内存地址。=== 比较对象时,比较的是其内存地址,而非内容。{} 和 {} 是两个不同的对象,位于不同的内存地址,因此 {} === {} 为假。
内存与堆:更深入的理解
下图简要说明:
const obj1 = {}; // 内存地址 aconst obj2 = {}; // 内存地址 bconsole.log(obj1 === obj2); // false, a !== bconst obj3 = obj1; // obj3 指向与 obj1 相同的内存地址console.log(obj1 === obj3); // true, 都指向 a
登录后复制
对象是引用类型,比较的是引用(内存地址),而非值。
typeof 运算符
typeof 运算符用于检测数据类型:
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"
登录后复制
null 和数组:对象的特殊情况
typeof null 返回 “object” 是 JavaScript 的一个历史遗留问题。数组和函数实际上是对象。
函数:特殊的对象
函数是对象,但拥有 [[call]] 属性,使其可调用。
function greet() { console.log("hello!");}greet(); // "hello!"
登录后复制
重要性
理解基元和对象的区别至关重要。比较对象内容,需使用深度比较,例如:
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
登录后复制
结论
1 === 1 为真,因为基元按值比较;{} === {} 为假,因为对象按引用比较。掌握这一区别,有助于编写更健壮的 JavaScript 代码。
以上就是为什么 == 为 true 但 {} === {} 为 false的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2642407.html