JavaScript中hasOwnProperty中的property是什么?

129

考虑以下代码:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

hasOwnProperty('someProperty')的正确用法/解释是什么?

为什么我们不能简单地使用someVar.someProperty来检查对象someVar是否包含名称为someProperty的属性?

在这种情况下,什么是属性?

这个JavaScript检查哪个属性?


4
题目:在JavaScript中hasOwnProperty是什么意思?回答:hasOwnProperty是JavaScript对象的一个内置方法,用于确定对象是否具有指定名称的属性。它返回一个布尔值,表示对象是否拥有该属性。如果对象拥有指定属性,返回true,否则返回false。 - Dor Cohen
当我提出这个问题时,我认为它是一个检查一些HTML的函数。现在我看到它检查一个JavaScript对象或方法中的“变量”。谢谢! - FLY
请查看 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/HasOwnProperty - Felix Kling
12个回答

207

hasOwnProperty 返回一个布尔值,用于指示调用它的对象是否具有与参数同名的属性。例如:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

然而,它不会查看对象的原型链。

当你使用 for...in 结构枚举一个对象的属性时,使用它是非常有用的。

如果想查看完整细节,ES5规范总是值得一看的好地方。


8
加分项是原型链。仍在尝试弄清楚当它不在对象上调用时它在调用什么……它不是 window - Kristoffer Sall-Storgaard
@KristofferSHansen - 我也在想这个问题,但是现在这个问题已经被编辑过了,所以它现在被称为一个对象。当它不是对象时,会抛出一个错误。 - James Allardice
我猜这会改变事情。但在Chrome控制台中运行时没有错误。 - Kristoffer Sall-Storgaard
@KristofferSHansen - 我认为这是因为控制台运行代码的方式(它作为eval代码而不是全局或函数代码运行)。我在一个空白的HTML页面中尝试了一下,结果出现了“无法将null转换为对象”的错误。 - James Allardice
@KristofferSHansen 当它在类方法上被调用时,请参考Kunal Vashist的答案。 - FLY
@scubaFLY,我的评论是基于最初的问题,那里它没有被用作类方法。 - Kristoffer Sall-Storgaard

47

以下是简短而准确的答案:

在JavaScript中,每个对象都有一些内置的键值对,这些键值对包含有关该对象的元信息。当您使用for...in构造/循环遍历对象的所有键值对时,您也会遍历这些元信息键值对(这绝对不是您想要的)。

Enter image description here

使用hasOwnPropery(property)可以过滤掉这些不必要的循环元信息,并直接检查参数property是否是对象中给定的属性。 通过过滤掉,我是指hasOwnProperty(property)不会查找property是否存在于对象的原型链中,即元信息中。

它基于此返回布尔值true/false

以下是一个示例:

var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"};
console.log(fruitObject.hasOwnProperty("name"));  //true
console.log(Object.prototype.hasOwnProperty("toString")) // true because in above snapshot you can see, that there is a function toString in meta-information

我希望这很清楚明了!


在你的示例的最后一行,你写了 console.log(Object.prototype....;你是想说 console.log(fruitObject. 吗?是fruitObject还是Object? - Hamid Araghi
3
"你正在循环遍历这些元信息的键值对,但是当我运行for (var key in fruitObject) { ... }时,JavaScript只循环遍历非原型键,我是否遗漏了什么或者JS运行时改变了它们处理对象键循环的方式?" - ChickenFeet

16

该方法检查:

返回一个布尔值,指示对象是否具有指定名称的属性

hasOwnProperty 方法返回 true 如果对象具有指定名称的属性,则返回 false。该方法不检查属性是否存在于对象的原型链中;该属性必须是对象本身的成员。

示例:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

2
我给了一个负一分,因为你最初的回答是一个短而毫无条理的句子,然后更新为稍微长一些、稍微更有条理但完全不准确的句子。 - user1106925
@amnotiam- 但我现在觉得更清楚了...这是因为我的网络问题,我不能发布更多的内容...... - Pranay Rana

16

概述:

hasOwnProperty()是一个可以在任何对象上调用并以字符串作为输入的函数。它返回一个布尔值,如果该属性位于对象上,则为true,否则返回false。 hasOwnProperty()位于Object.prototype上,因此对于任何对象都可用。

示例:

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

Person.prototype.age = 25;

const willem = new Person('willem');

console.log(willem.name); // Property found on object
console.log(willem.age); // Property found on prototype

console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself
console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself

在这个例子中创建了一个新的 Person 对象。每个 Person 对象都有自己的名字,这些名字在构造函数中初始化。然而,年龄不是位于对象上而是位于对象的原型上。因此,hasOwnProperty() 对于名称返回 true,对于年龄返回 false
实际应用: 使用 for in 循环遍历对象时,hasOwnProperty() 可以非常有用。您可以通过它检查属性是否来自对象本身而不是原型。例如:

function Person(name, city) {
  this.name = name;
  this.city = city;
}

Person.prototype.age = 25;

const willem = new Person('Willem', 'Groningen');

for (let trait in willem) {
  console.log(trait, willem[trait]); // This loops through all properties, including the prototype
}

console.log('\n');

for (let trait in willem) {
  if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object
    console.log(trait, willem[trait]);
  }
}


4
您可以使用object.hasOwnProperty(p)来确定一个对象是否具有可枚举的属性p
一个对象可以拥有自己的原型,在那里为每个实例分配了“默认”方法和属性。只有在构造函数中明确设置或稍后添加到实例中的属性,hasOwnProperty才会返回true。
要确定p在对象的任何地方是否被定义,请使用if(p instanceof object),其中p评估为属性名称字符串。
例如,默认情况下,所有对象都具有'toString'方法,但它不会出现在hasOwnProperty中。

4

hasOwnProperty 是检查一个 对象 是否拥有某个 属性 的正确方式。不能将 someVar.someProperty 用作替代方案。下面的条件将显示出很好的区别:

const someVar = { isFirst: false };


// The condition is true, because 'someVar' has property 'isFirst'
if (someVar.hasOwnProperty('isFirst')) {
  // Code runs
}


// The condition is false, because 'isFirst' is false.
if (someVar.isFirst) {
  // Code does not runs here
}

因此,someVar.isFirst 不能用作 someVar.hasOwnProperty('isFirst') 的替代。

2

hasOwnProperty是一个普通的JavaScript函数,它接受一个字符串参数。

在你的例子中,somevar.hasOwnProperty('someProperty'),它检查somevar函数是否有someproperty属性 - 它返回true或false。

比如说

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

1

hasOwnProperty('someProperty') 的正确使用/解释是什么?

hasOwnProperty() 方法返回一个 boolean,指示对象是否具有指定的属性作为自己的属性(而不是继承它)。

const someVar = {};
someVar.someProperty = 'Foo';

console.log(someVar.hasOwnProperty('someProperty'));
// expected output: true

console.log(someVar.hasOwnProperty('someProperty1'));
// expected output: false

为什么我们不能简单地使用 someVar.someProperty 来检查一个名为 someProperty 的属性是否存在于对象 someVar 中?

someVar.someProperty 将返回属性的值,你无法通过 someVar.someProperty 检查该属性在对象中是否可用。

现在在 ES2022 中,引入了一种新方法,即 Object.hasOwn(<object reference>, <property name>),这个方法旨在替代 Object.hasOwnProperty(),克服了一些 .hasOwnProperty() 的限制。


1

2021 - Object.hasOwn 作为 Object.hasOwnProperty() 的替代品

正如其他答案所示,hasOwnProperty 将检查对象自身的属性,而 in 则会检查继承的属性。

现在有一种新的替代方法叫做 Object.hasOwn(),旨在替代 Object.hasOwnProperty()

Object.hasOwn() 是一个静态方法,如果指定的对象具有指定的属性作为其自己的属性,则返回 true。如果该属性是继承的或不存在,则该方法返回 false。

const person = { name: 'dan' };

console.log(Object.hasOwn(person, 'name'));// true
console.log(Object.hasOwn(person, 'age'));// false

const person2 = Object.create({gender: 'male'});

console.log(Object.hasOwn(person2, 'gender'));// false

推荐使用此方法而不是Object.hasOwnProperty(),因为它也适用于使用Object.create(null)创建的对象以及覆盖了继承的hasOwnProperty()方法的对象。虽然可以通过在外部对象上调用Object.prototype.hasOwnProperty()来解决这些问题,但Object.hasOwn()克服了这些问题,因此更受欢迎(请参见下面的示例)。

let person = {
  hasOwnProperty: function() {
    return false;
  },
  age: 35
};

if (Object.hasOwn(person, 'age')) {
  console.log(person.age); // true - the remplementation of hasOwnProperty() did not affect the Object
}

let person = Object.create(null);
person.age = 35;
if (Object.hasOwn(person, 'age')) {
  console.log(person.age); // true - works regardless of how the object was created
}

关于 Object.hasOwn 更多信息,请点击此处:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

浏览器兼容性 - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility


0

场景 A:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

场景B:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing


由于JavaScript不保护hasOwnProperty属性,所以您可以像这样使用它:
for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接