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

时间:2015-09-06 11:07:31

标签: javascript loops object

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

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

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

    if(obj.hasOwnProperty(key)){
      safe
    }

  }
}

如果我不愿意,我不想在循环内添加额外内容。

http://phrogz.net/death-to-hasownproperty

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

4 个答案:

答案 0 :(得分:27)

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

换句话说:如果您希望属性(包含数据或函数)来自对象本身以外的其他地方,请执行所谓的检查。

例如:

Object.hasOwnProperty

如果您只想要自己的房产,是否要避免全部检查?

自ECMA-Script 5.x起,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 有一个新函数Object,它返回一个字符串数组,其中的项是来自给定对象的自己的属性

Object.keys

此外,由于ECMA-Script 5.x,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); 具有Array.prototype,可以流畅地执行 for-each循环

Array.prototype.forEach

答案 1 :(得分:2)

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

for (var i = 0; i < length; i++)data.forEach()

不需要这样做

答案 2 :(得分:1)

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

当你调用Test.hasOwnProperty(name)时,你传递的是name变量的值(它不存在),就像你写下alert(name)一样。

来自Object的每个对象都继承hasOwnProperty方法。此方法可用于确定对象是否具有指定的属性作为该对象的直接属性;

谢谢

答案 3 :(得分:1)

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

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

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

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

如果问题稍微改写为:“如果我可以完全控制 JS 脚本、使用它的位置以及其或父范围内的所有内容,是否需要使用 hasOwnProperty()?”
那么不,您不需要使用 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()。 在您的脚本启动之前甚至之后。
效果是追溯性的。即使您声明变量“使用原始对象类型”, 它在 JS 中无法正常工作,重新定义的 Object 类型也会影响之前创建的此类变量。

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

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

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