为什么我们总是需要检查对象是否有密钥? - JS

时间:2017-06-17 14:55:26

标签: javascript

我有以下代码。

var obj = {
  name : 'Krysten',
  age : 33,
  hasPets : false
};

function listAllValues(obj) {
  // your code here
  var array = [];
  for(var key in obj) {
    if(obj.hasOwnProperty(key)) {
        var value = obj[key];
        array.push(value);
    }
}
  console.log(array);

}

listAllValues(obj);

我想专注于这段代码:

for(key in obj) {
    if(obj.hasOwnProperty(key)) {

    }
}

为什么我们总是需要检查obj是否有自己的属性键? 这对我来说听起来不太清楚。任何能够以非专业术语向我解释的人? 对不起来这里。

2 个答案:

答案 0 :(得分:9)

hasOwnProperty次检查是对象本身的property。它也可能是原型的属性。因此,您可以检查该属性是否属于当前对象,而不是它的原型。

示例

我有object,其中有prototype。使用纯for in,它会打印所有属性,也会打印prototype(id)中的属性。但是对于第二个,它只打印属于对象本身的那些。



var parent = {
    id: 1
};

var obj = {
   name: 'Test',
   age: 18
};

Object.setPrototypeOf(obj, parent);

// All properties, also the prototype's. See the `id` property
console.log('All properties');
for(var key in obj){
    console.log(key);
}

console.log('Only it\'s properties');
// All properties that belong only to object
for(var key in obj){
    if(obj.hasOwnProperty(key)) {
       console.log(key);
    }
}




答案 1 :(得分:3)

这是一个来自黑暗时代的残余,当JS不是那么光滑而且它的开发者更粗糙。当每个人extended basic prototypes而我们没有define non-enumerable properties的能力时。

所以你永远不知道由于继承而导致你的对象出现了什么属性;当我们介绍这种检查的做法时,它就是一个属于自己的财产。这也是扩展外国原型的一种不良做法。

但这些是更粗糙,更黑暗的时期。当你需要精神力量来编写JS的时候。当你需要智慧来编写一个在多个浏览器中工作的功能时,钢铁的神经接近甚至修改别人的代码,从来不知道你可能带给你的是什么?

现在我立即放弃了一个外来的lib,它会随机修改基本原型(极少数例外),特别是如果它不能进行这些扩展{{1} }。