116

考虑:

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

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

为什么我们不能简单地使用someVar.someProperty来检查一个对象是否someVar包含带有 name 的属性someProperty

在这种情况下,什么是财产?

这个 JavaScript 检查什么属性?

4

10 回答 10

196

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

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

但是,它不看对象的原型链。

当您使用构造枚举对象的属性时,使用它很有用for...in

如果您想查看完整的细节,ES5 规范一如既往地是一个不错的地方。

于 2012-02-22T14:24:36.153 回答
43

这是一个简短而准确的答案:

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

在此处输入图像描述

使用hasOwnPropery(property) 过滤器过滤掉这些不必要的元信息循环,并直接检查参数property是否是对象中的用户给定属性。我的意思是filters -outhasOwnProperty(property)看起来并不property存在于 Object 的原型链(即元信息)中。

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

我希望它很清楚!

于 2017-09-26T11:28:10.747 回答
16

它检查:

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

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

例子:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true
于 2012-02-22T14:20:31.700 回答
14

概括:

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年龄。

实际应用:

hasOwnProperty()在使用循环遍历对象时非常有用for in。如果属性来自对象本身而不是原型,您可以检查它。例如:

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]);
  }
}

于 2018-08-17T15:31:30.923 回答
4

您使用 object.hasOwnProperty( p ) 来确定对象是否具有可枚举属性p -

对象可以有自己的原型,其中“默认”方法和属性分配给对象的每个实例。hasOwnProperty 仅对在构造函数中专门设置或稍后添加到实例的属性返回 true。

要确定是否在任何地方为对象定义了p ,请使用 if( p instanceof object),其中 p 的计算结果为属性名称字符串。

例如,默认情况下,所有对象都有一个“toString”方法,但它不会显示在 hasOwnProperty 中。

于 2012-02-22T14:45:28.327 回答
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').

于 2020-05-04T17:21:19.413 回答
2

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

在您的情况下somevar.hasOwnProperty('someProperty'),它会检查somevar函数是否somepropery存在 - 它返回 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
    }
}
于 2012-02-22T14:28:56.013 回答
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()因为它也适用于通过 using 创建的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/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

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

于 2021-10-31T07:49:25.657 回答
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])
  }
}
于 2020-01-16T08:10:26.630 回答
-2

检查对象是否具有属性if(obj.prop)据我所知,它的工作原理与 相同。

于 2012-02-22T14:24:06.333 回答