ZetCode

JavaScript 的 in 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 JavaScript 中的 in 运算符检查属性是否存在。

in 关键字

如果指定属性存在于对象或其原型链中,in 运算符将返回 true。它检查自有属性和继承属性。语法是 property in object,其中 property 是一个字符串或符号。

当您需要在访问对象之前验证它是否具有某个特定属性时,in 运算符非常有用。它与数组一起使用以检查索引是否存在。它与检查属性的值是否未定义有所不同。

hasOwnProperty() 不同,in 运算符会检查整个原型链。对于仅有自有属性,请将 inhasOwnProperty() 结合使用,或在现代 JS 中使用 Object.hasOwn()

基本对象属性检查

以下示例演示了 in 运算符与对象的基本用法。

main.js
const person = {
    name: 'John',
    age: 30
};

console.log('name' in person);  // true
console.log('email' in person); // false

这检查 'name' 和 'email' 属性是否存在于 person 对象中。第一个检查返回 true,因为 'name' 存在,而 'email' 返回 false。属性名称必须指定为字符串。

$ node main.js
true
false

检查数组索引

in 运算符可以检查数组是否具有特定的索引。

main.js
const colors = ['red', 'green', 'blue'];

console.log(0 in colors);  // true
console.log(3 in colors);  // false
console.log('length' in colors); // true

数组在 JavaScript 中是对象,因此我们可以检查索引是否存在。请注意,'length' 是一个内置的数组属性。该检查对现有索引返回 true,对不存在的索引返回 false。

$ node main.js
true
false
true

继承属性检查

in 运算符检查整个原型链中的属性。

main.js
function Person(name) {
    this.name = name;
}

Person.prototype.age = 30;

const john = new Person('John');

console.log('name' in john); // true
console.log('age' in john);  // true
console.log('toString' in john); // true

在这里,我们看到 in 找到了自有属性 (name) 和继承属性 (age, toString)。age 属性来自原型,而 toString 来自 Object.prototype。

$ node main.js
true
true
true

in 和 hasOwnProperty 的区别

此示例显示了 inhasOwnProperty 之间的区别。

main.js
const car = {
    make: 'Toyota'
};

console.log('make' in car);          // true
console.log(car.hasOwnProperty('make')); // true

console.log('toString' in car);          // true
console.log(car.hasOwnProperty('toString')); // false

in 运算符找到继承的属性,如 toString,而 hasOwnProperty 仅检查自有属性。当您需要从检查中排除继承的属性时,请使用 hasOwnProperty。

$ node main.js
true
true
true
false

检查 Symbol 属性

in 运算符也适用于 Symbol 属性。

main.js
const id = Symbol('id');
const user = {
    [id]: 123,
    name: 'Alice'
};

console.log(id in user);       // true
console.log('name' in user);   // true
console.log(Symbol('id') in user); // false

必须确切地引用 Symbol 才能找到它们。最后一个检查失败,因为它使用了不同的 Symbol 实例。Symbol 属性是唯一的,不能被意外覆盖。

$ node main.js
true
true
false

检查 DOM 元素属性

in 运算符可以检查 DOM 元素属性和方法。

main.js
const element = document.createElement('div');

console.log('innerHTML' in element);  // true
console.log('click' in element);      // true
console.log('nonExistent' in element); // false

这检查某些属性和方法是否存在于 DOM 元素上。请注意,这在浏览器环境中有效。DOM 元素从它们的原型链继承了许多属性。

$ node main.js
true
true
false

实际用例:特性检测

这是一个使用 in 进行特性检测的实际例子。

main.js
// Check if browser supports the fetch API
if ('fetch' in window) {
    console.log('Fetch API is supported');
} else {
    console.log('Consider using XMLHttpRequest or a polyfill');
}

// Check if a specific method exists
const obj = {
    modernMethod() {
        console.log('Modern method called');
    }
};

if ('modernMethod' in obj) {
    obj.modernMethod();
}

这演示了如何在 API 支持之前检查它。特性检测比浏览器嗅探更可靠。第二部分显示了在调用对象中的特定方法之前检查该方法。

$ node main.js
Consider using XMLHttpRequest or a polyfill
Modern method called

来源

in - 语言参考

在本文中,我们演示了如何使用 in 运算符来检查 JavaScript 对象和数组中属性是否存在。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。