Javascript ES5:JS中的Object.keys本机方法

Javascript ES5:JS中的Object.keys本机方法,javascript,Javascript,我使用Object.keys在JS中迭代对象的键,如下所示: var cv = view.childViews; Object.keys(cv).forEach(function(key) { this.destroyView(cv[key]); }.bind(this)); 但是,当cv未定义或不是对象时,object.keys会抛出错误。与在Object.

我使用Object.keys在JS中迭代对象的键,如下所示:

               var cv = view.childViews;

                Object.keys(cv).forEach(function(key) {
                    this.destroyView(cv[key]);
                }.bind(this));
但是,当cv未定义或不是对象时,object.keys会抛出错误。与在Object.keys周围放置if语句来检查cv的类型是否为对象不同,是否有一个本机方法比Object.keys更好,因为如果cv未定义,它不会引发错误

这不是我的全部观点:

Object.keys(cv) vs cv.keys().each()
如果cv为null,则第一个不应抛出错误,而后一个应抛出错误。 见鬼,谢谢你

如果你不帮我,我会这么做,这让我很懊恼:

              if(typeof cv === 'object'){
                    Object.keys(cv).forEach(function(key) {
                        this.destroyView(cv[key]);
                    }.bind(this));
                }
事实证明,在ES6中,object.keys的非对象参数将被“强制”为对象,请参见:

我认为@Pointy的答案是正确的,所以我把它放在这里:

Object.keys(cv || {}).forEach(...)
基本上,如果未定义
cv
,则使用虚拟对象而不执行任何操作

另一种策略是在
var
中也这样做:

var cv = view.childViews || {};

如果你只是在迭代,有一个很好的方法


关于
Object.keys(cv |{}).forEach(…)
如何不幸的是,
typeof
可能是唯一允许未定义运算符的运算符。@Pointy在
cv
未声明时不起作用:
未捕获引用错误:未定义cv
@Derek朕會功夫 当然可以,但是上面一行的作业也会失败。(在这种情况下,我会在
var
语句中执行
|{}
。@Pointy我想:)注意
中的…也会迭代继承的属性
for(var i in null){
  alert(i);
}

for(var i in undefined){
  alert(i);
}

var obj = {hello: 'world'};

for(var i in obj){
  alert(i);
  alert(obj[i]);
}