我读到在循环对象时我们应该总是使用hasOwnProperty,因为对象可以被其他东西修改以包含我们不想要的一些键
但这总是需要吗?是否存在不需要它的情况?这也是局部变量所必需的吗?
function my(){
var obj = { ... };
for(var key in obj){
if(obj.hasOwnProperty(key)){
safe
}
}
}
如果我不愿意,我不想在循环内添加额外内容。
http://phrogz.net/death-to-hasownproperty
这家伙说我不应再使用它了。
答案 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)
这里有一些很好的答案,描述了 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()
。