检查 JavaScript 对象中键是否存在:面向初学者的解析
您是否曾尝试从 JavaScript 对象中获取值,却只得到神秘的 undefined?很熟悉的情况,对吧?尤其是在处理来自 API、配置文件或大型结构的数据时。今天我们将一劳永逸地弄清楚如何正确地检查对象中是否存在某个键。这是 Stack Overflow 上最热门的问题之一——这并非没有原因。
想象一下,对象就像一个带抽屉的柜子。您想知道里面是否有一个标有“钥匙”的抽屉。您可以直接拉把手(如果抽屉不存在,就会出错),也可以先看一眼确认。在 JavaScript 中,我们有三种可靠的方法可以做到这一点。开始吧!
为什么需要检查键是否存在?
假设您正在编写一个购物清单应用程序。您有一个 cart 对象,其中可能包含带有数量的商品:
const cart = { apples: 3, bananas: 5};
// 想要添加梨,但不知道是否已经存在function addItem(item, quantity) { if (cart[item] !== undefined) { cart[item] += quantity; } else { cart[item] = quantity; }}这段代码可以工作,但有一些陷阱。如果键的值是 0 或 null 怎么办?那么对 undefined 的检查会给出错误的结果。因此,让我们分析一下专业的方法。
方法 1:in 运算符——全能战士
in 运算符检查对象中是否存在某个属性,包括继承的属性。当您需要知道某个键是否普遍存在时,这是最可靠的方法。
const user = { name: 'Anna', age: 25, isAdmin: false};
console.log('name' in user); // trueconsole.log('age' in user); // trueconsole.log('salary' in user); // falseconsole.log('toString' in user); // true (继承自 Object)优点:即使值是 null、undefined 或 false 也能工作。检查整个原型链。
缺点:可能会找到您不需要的继承属性。例如,toString 或 hasOwnProperty。
在大多数情况下,in 是理想的选择。尤其是当您处理普通的字典对象时。
方法 2:hasOwnProperty()——仅限自有键
如果您只需要检查对象自身的属性(而非继承的属性),请使用 hasOwnProperty 方法。这是 JavaScript 中所有对象的标准方法。
const book = { title: 'JavaScript 入门指南', pages: 300};
console.log(book.hasOwnProperty('title')); // trueconsole.log(book.hasOwnProperty('pages')); // trueconsole.log(book.hasOwnProperty('toString')); // false (非自有属性)console.log(book.hasOwnProperty('author')); // false请注意:hasOwnProperty 不检查继承的属性。这使得它在您使用类或原型创建对象时不可或缺。
但有一个细节!如果您的对象是使用 Object.create(null) 创建的,它将没有 hasOwnProperty 方法。怎么办?使用安全调用:
const dict = Object.create(null);dict.key1 = 'value1';
// 这样不行:// console.log(dict.hasOwnProperty('key1')); // TypeError
// 但这样可以:console.log(Object.prototype.hasOwnProperty.call(dict, 'key1')); // true现代语法允许使用 Object.hasOwn()——ES2022 中添加的静态方法。它优雅地解决了这个问题:
console.log(Object.hasOwn(dict, 'key1')); // true我建议使用 Obj