是的,始终使用它 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()
即使在看起来没有必要和浪费的情况下也可以使用。