下面两个语句产生相同的输出吗?我们有理由选择其中一种方式而不是另一种吗?
if (key in object)
if (object.hasOwnProperty(key))
下面两个语句产生相同的输出吗?我们有理由选择其中一种方式而不是另一种吗?
if (key in object)
if (object.hasOwnProperty(key))
当前回答
正如其他答案所指出的,hasOwnProperty将检查对象自身的属性,而在其中还将检查继承的属性。
新方法2021 - Object.hasOwn()取代Object.hasOwnProperty()
Object.hasOwn()旨在替代Object.hasOwnProperty(),是一个可用的新方法(但仍然不是所有浏览器都完全支持,如您可以在这里看到的- https://caniuse.com/?search=hasOwn )
object . hasown()是一个静态方法,如果指定对象将指定的属性作为自己的属性,则返回true。如果该属性被继承,或不存在,则该方法返回false。
Const person = {name: 'dan'}; console.log(对象。hasOwn(person, 'name')) console.log(对象。hasOwn(person, 'age')) const person2 =对象。创建({性别:男性的}); console.log(对象。hasOwn(person2, 'gender'))
建议在Object.hasOwnProperty()方法上使用此方法,因为它也适用于使用Object.create(null)创建的对象以及覆盖继承的hasOwnProperty()方法的对象。虽然可以通过在外部对象上调用object .prototype. hasownproperty()来解决这类问题,但object . hasown()克服了这些问题,因此是首选的(参见下面的示例)
Let person = { hasOwnProperty: function() { 返回错误; }, 年龄:35 }; 如果对象。hasOwn(人,年龄)){ console.log (person.age);// true - hasOwnProperty()的补充不影响对象 }
let person = Object.create(null); 的人。年龄= 35岁; 如果对象。hasOwn(人,年龄)){ console.log (person.age);// true -无论对象是如何创建的都有效 }
更多关于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
其他回答
我会用另一个例子来解释。 假设我们有以下两个属性的对象:
function TestObj(){
this.name = 'Dragon';
}
TestObj.prototype.gender = 'male';
让我们创建TestObj实例:
var o = new TestObj();
让我们检查一下对象实例:
console.log(o.hasOwnProperty('name')); // true
console.log('name' in o); // true
console.log(o.hasOwnProperty('gender')); // false
console.log('gender' in o); // true
结论:
如果属性可被对象直接访问或从原型访问,则In运算符总是返回true hasOwnProperty()只在实例上存在属性,而在其原型上不存在时才返回true
如果我们想要检查原型上是否存在某些属性,逻辑上,我们会说:
console.log(('name' in o) && !o.hasOwnProperty('name')); //false
console.log(('gender' in o) && !o.hasOwnProperty('gender')); //true - it's in prototype
最后:
所以,关于这两个条件…
if (key in object)
if (object.hasOwnProperty(key))
...产生同样的结果,答案是显而易见的,视情况而定。
总之,hasOwnProperty()不查看原型,而In查看原型。
摘自O'Reilly高性能Javascript:
属性可以确定对象是否具有实例成员 使用hasOwnProperty()方法,并传入 成员名。来确定对象是否具有对对象的访问权 属性,则可以使用in操作符。例如:
var book = {
title: "High Performance JavaScript",
publisher: "Yahoo! Press"
};
alert(book.hasOwnProperty("title")); //true
alert(book.hasOwnProperty("toString")); //false
alert("title" in book); //true
alert("toString" in book); //true
在这段代码中,hasOwnProperty()在传入“title”时返回true 因为title是一个对象实例;时,该方法返回false 传入" toString "是因为它在实例中不存在。当 每个属性名与in操作符一起使用,结果为真 两次都是因为它搜索实例和原型。
正如其他答案所指出的,hasOwnProperty将检查对象自身的属性,而在其中还将检查继承的属性。
新方法2021 - Object.hasOwn()取代Object.hasOwnProperty()
Object.hasOwn()旨在替代Object.hasOwnProperty(),是一个可用的新方法(但仍然不是所有浏览器都完全支持,如您可以在这里看到的- https://caniuse.com/?search=hasOwn )
object . hasown()是一个静态方法,如果指定对象将指定的属性作为自己的属性,则返回true。如果该属性被继承,或不存在,则该方法返回false。
Const person = {name: 'dan'}; console.log(对象。hasOwn(person, 'name')) console.log(对象。hasOwn(person, 'age')) const person2 =对象。创建({性别:男性的}); console.log(对象。hasOwn(person2, 'gender'))
建议在Object.hasOwnProperty()方法上使用此方法,因为它也适用于使用Object.create(null)创建的对象以及覆盖继承的hasOwnProperty()方法的对象。虽然可以通过在外部对象上调用object .prototype. hasownproperty()来解决这类问题,但object . hasown()克服了这些问题,因此是首选的(参见下面的示例)
Let person = { hasOwnProperty: function() { 返回错误; }, 年龄:35 }; 如果对象。hasOwn(人,年龄)){ console.log (person.age);// true - hasOwnProperty()的补充不影响对象 }
let person = Object.create(null); 的人。年龄= 35岁; 如果对象。hasOwn(人,年龄)){ console.log (person.age);// true -无论对象是如何创建的都有效 }
更多关于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
另一种形式(在中调用)枚举属性名(或键) 物体的。控件中的另一个属性名字符串 对象被赋值给变量。通常有必要进行测试 object.hasOwnProperty(变量)来确定属性名是否 是对象的真正成员,或者在原型链上找到。
for (myvar in obj) {
if (obj.hasOwnProperty(myvar)) { ... } }
(摘自Crockford的Javascript: The Good Parts)
小心——它们不会产生相同的结果。
如果在原型链的某个地方找到key, in也会返回true,而Object。hasOwnProperty(就像名字已经告诉我们的那样),只会在key在该对象上直接可用时返回true(它的“拥有”属性)。