我什么时候需要使用 hasOwnProperty()?

IT技术 javascript loops object
2021-03-10 11:52:28

我读到我们应该在循环对象时始终使用 hasOwnProperty,因为对象可以被其他东西修改以包含一些我们不想要的键。

但这总是必要的吗?是否存在不需要它的情况?局部变量也需要这样吗?

function my(){
  var obj = { ... };
  for(var key in obj){
    if(obj.hasOwnProperty(key)){
      safe
    }
  }
}

如果我不需要的话,我只是不喜欢在循环中添加额外的if

拥有财产的死亡

这家伙说我不应该再使用它了。

4个回答

Object.hasOwnProperty 确定整个属性是在对象本身还是在原型链中定义的。

换句话说:如果你想要来自对象本身之外的其他地方的属性(带有数据或函数),请进行所谓的检查。

例如:

function A() {
   this.x = "I'm an own property";
}

A.prototype.y = "I'm not an own property";

var instance = new A();
var xIsOwnProperty = instance.hasOwnProperty("x"); // true
var yIsOwnProperty = instance.hasOwnProperty("y"); // false

如果您只想要自己的财产,您是否想避免整个检查?

从 ECMAScript 5.x 开始,Object有一个新函数Object.keys返回一个字符串数组,其中的项是给定对象自己的属性

var instance = new A();
// This won't contain "y" since it's in the prototype, so
// it's not an "own object property"
var ownPropertyNames = Object.keys(instance);

此外,从 ECMAScript 5.xArray.prototype开始Array.prototype.forEach,我们可以流畅地执行for-each 循环

Object.keys(instance).forEach(function(ownPropertyName) {
    // This function will be called for each found "own property", and
    // you don't need to do the instance.hasOwnProperty check any more
});
但是想象一下,我创建了自己的对象:var obj = {a: 'a', b: 'b'}并且我想遍历obj. 我需要过滤hasOwnProperty吗?
2021-04-23 11:52:28
@elad.chen 谢谢;P 简单但仍然有效!
2021-04-29 11:52:28
我会考虑添加 Object.keys(obj).forEach(..); 的用法。因为这将阻止原型查找..
2021-04-29 11:52:28
我知道了。无论如何,如果有人看到我的评论,他会对我的意思有一个基本的了解。
2021-05-10 11:52:28
@elad.chen 好的,我可以添加这个。我担心一个简单的问答会变成一个完整的维基百科页面哈哈
2021-05-14 11:52:28

当您使用for (var key in obj)它时,它将循环遍历原型链上的给定对象 + 其父对象的属性,直到到达链的末尾。由于您只想检查特定对象的属性,因此需要使用hasOwnProperty.

这在for (var i = 0; i < length; i++)或 中不需要data.forEach()

hasOwnProperty 期望属性名称为字符串。

当您调用时,Test.hasOwnProperty(name)您将 name 变量的值(不存在)传递给它,就像您编写alert(name) 一样

从 Object 继承的每个对象都继承了该hasOwnProperty 方法。该方法可用于判断一个对象是否具有指定的属性作为该对象的直接属性;

是的,始终使用它 for ... in

这里有一些很好的答案,描述了hasOwnProperty()它的作用并提供了其他解决方案。
但是没有人能回答这个问题和评论中的@João 所问的问题。
这总是需要吗?

换句话说,如果对象是我的,如果我可以控制它,如果对象定义为我自己的局部变量,我还需要使用hasOwnProperty()吗?

这个问题的复杂之处在于,在此考虑中,对 Object 类型变量的控制并不重要。
重要的是对 Object 类型本身的控制。

如果问题稍微改写为:hasOwnProperty()如果我可以完全控制 JS 脚本、使用它的位置以及其或父范围内的所有内容,是否需要使用?”
那么不,你不需要使用hasOwnProperty(). 但是对环境的完全控制并不是您应该指望的。

考虑这个例子

var variableCreatedByInocentUser = { amisane: 'yes' };
for (let key in variableCreatedByInocentUser) {
    console.log(key +'? '+ variableCreatedByInocentUser[key]);
}

console.log('-----');

Object.prototype.amicrazy = 'yes, you redefined Object type';

for (let key in variableCreatedByInocentUser) {
    console.log(key +'? '+ variableCreatedByInocentUser[key]);
}

console.log('-----');

for (let key in variableCreatedByInocentUser) {
    if (!variableCreatedByInocentUser.hasOwnProperty(key)) { continue; }
    console.log(key +'? '+ variableCreatedByInocentUser[key]);
}

hasOwnProperty()有人重新定义 Object 类型之前,可以放弃only 。在您的脚本启动之前或之后。
效果具有追溯力。即使您声明变量“使用原始对象类型”,它在 JS 中也不会按预期工作,并且重新定义的对象类型也会影响之前创建的此类变量。

尽管不鼓励重新定义基本类型,但在某些框架中已经这样做了。可以将此类框架包含并引入您的全局范围并破坏您的脚本。
也可能存在安全问题。对象可能会被恶意重新定义,使您的循环执行额外的任务。

如果您想遵循良好的实践,您应该始终考虑所有可能的情况,例如您正在编写的代码可以被重用或插入,或加入另一个项目。

hasOwnProperty()即使在看起来没有必要和浪费的情况下也可以使用