gpt4 book ai didi

javascript - 在任何情况下我应该使用 in 运算符而不是 hasOwnProperty()?

转载 作者:行者123 更新时间:2023-12-01 15:51:05 25 4
gpt4 key购买 nike

在 JavaScript 中,in运算符检查对象是否具有指定的属性。但是,它不仅检查对象自身的属性,还检查原型(prototype)链。因此,在某些情况下,它的行为可能与预期不完全一样。

假设由于某种原因我们有一个对象 someArrayMethods包含(显然)一些数组方法作为键:

const someArrayMethods = {
indexOf: true,
map: true,
};

我们可以使用 in 检查该对象是否具有特定方法作为键。运算符(operator):
console.log('indexOf' in someArrayMethods); // true
console.log('every' in someArrayMethods); // false

如果我们尝试检查 toString 会怎样?属性(property)?
console.log('toString' in someArrayMethods); // true

惊喜!原来这个对象有一个 toString method在原型(prototype)链中,所以 in运算符返回 true即使对象没有自己的 toString属性(property)。

这里是 hasOwnProperty() 来救援!和 in 几乎一样运算符,有一个区别:它不检查原型(prototype)链。我们可以重写我们之前的例子:
console.log(someArrayMethods.hasOwnProperty('toString'));  // false

现在它按预期工作。不幸的是, hasOwnProperty()在一种情况下也可能失败。如果我们有一个拥有自己属性的对象 hasOwnProperty ?看这个例子:
const someObject = {
hasOwnProperty() {
return false;
},
theAnswer: 42,
};

// Does `someObject` has own property `theAnswer`?
console.log(someObject.hasOwnProperty('theAnswer')); // false
// Well, it seems it doesn't...

为了解决这个问题,而不是使用 someObject.hasOwnProperty , 我们可以直接从 Object.prototype 中引用该方法:
const hasOwn = Object.prototype.hasOwnProperty;
console.log(hasOwn.call(someObject, 'theAnswer')); // true

这似乎是检查对象是否具有某些属性的最合理方法。尽管如此, 有没有in运算符会很有用 ?我知道它可以用来检查某个类的实例是否有某种方法,但是在这种情况下,简单地检查该对象是否是该类的实例不是更好吗?

作为旁注,另一种选择是使用 Object.keys() 使用 ECMAScript 2016 Array.prototype.includes() :
console.log(Object.keys(someObject).includes('theAnswer')); // true

最佳答案

in是运营商,所以不能被劫持。您不必依赖没有更改或隐藏脚本 Object , Object.prototype , Object.prototype.hasOwnProperty , Object.prototype.hasOwnProperty.call .

这是了解对象是否具有某些属性的快速方法。我的意思是,如果 obj.foo可以返回,例如"bar"即使 foo属性是继承的,因此能够知道 obj 是否有意义。有那个foo属性(property)与否,无论是拥有还是继承。

当然,如果我们只有 HasOwnProperty,我们可以(通常)继续调用 [[GetPrototypeOf]] 直到链的末尾,并检查每个对象。但这对代码来说会很乏味,可能比 native in 慢,并且在 ES5 之前是不可能的。

此外,还有根本区别。 in运算符使用 [[HasProperty]] 内部方法,而 HasOwnProperty 使用 [[GetOwnProperty]]。对于非普通对象,迭代 [[GetOwnProperty]] 和 [[GetPrototypeOf]] 可能会产生与 [[HasProperty]] 不同的结果。

所以是的:in当您要调用对象的内部 [[HasProperty]] 方法时,运算符很有用。其实除了Reflect.has ,这是唯一正确的方法。

var p = new Proxy({}, {has: function() {
console.log('Hooray!');
return true;
}});
p.hasOwnProperty('foo'); // :(
'foo' in p; // Hooray! :)

关于javascript - 在任何情况下我应该使用 in 运算符而不是 hasOwnProperty()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40335779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com