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

Ann*_* K. 15 javascript loops object

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

但这总是需要吗?有没有不需要的情况?这也是局部变量所必需的吗?

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

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

  }
}
Run Code Online (Sandbox Code Playgroud)

如果我不需要,我只是不喜欢在循环内添加额外的东西.

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

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

Mat*_*zer 28

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
Run Code Online (Sandbox Code Playgroud)

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

由于ECMA-Script 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);
Run Code Online (Sandbox Code Playgroud)

此外,由于ECMA脚本5.x中,Array.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 anymore
});
Run Code Online (Sandbox Code Playgroud)