Javascript 为什么这些属性不可枚举?

Javascript 为什么这些属性不可枚举?,javascript,object,enumerable,Javascript,Object,Enumerable,我有一个简单的对象对象: window.abilities = { migrate:{ name:"Migrate", description:"Move your tribe to another area; generate all new resources. Takes one time unit.", image:"migrate.png",

我有一个简单的对象对象:

window.abilities = {
            migrate:{
                name:"Migrate",
                description:"Move your tribe to another area; generate all new resources. Takes one time unit.",
                image:"migrate.png",
                action:"Migrate",
                unlocked:true
            },
            eradicate:{
                name:"Eradicate species",
                description:"Remove a troublesome plant or animal",
                image:"migrate.png",
                action:"Eradicate",
                unlocked:false
            }
        }
我正在使用一个。。。在里面循环以迭代此对象并生成UI元素:

for(ability in window.abilities){
    if(ability.unlocked){
        $("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
    }
}
但是,每个能力变量都是空的-它只有键,没有属性(名称、描述等)。这些属性似乎是不可数的-即使以这种方式创建的属性在默认情况下应该是可枚举的


如何使这些属性可以隐式枚举,而不使用Object.defineProperty或类似的笨拙操作?

尝试使用
for..of
Object.values进行迭代(仅限ES6):


尝试使用
for..of
Object.values
(仅限ES6)进行迭代:


如果您能够使用ES6和
来。。。在
loop中,阿尔贝托的答案是你最好的选择,也是最干净的选择

如果您仅限于ES5,您可以使用
来。。。也在
中。正如您所发现的,
用于。。。在
中,只枚举键(属性名称),而不枚举属性值,但一旦知道属性名称,就很容易获得属性值:

var abilityName, ability;

for(abilityName in window.abilities){
    ability = window.abilities[abilityName];
    if(ability.unlocked){
        $("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
    }
}

获取属性名称意味着您正在成功枚举属性。Javascript只是有点奇怪,
对于。。。如果您能够使用ES6和
来。。。在
loop中,阿尔贝托的答案是你最好的选择,也是最干净的选择

如果您仅限于ES5,您可以使用
来。。。也在
中。正如您所发现的,
用于。。。在
中,只枚举键(属性名称),而不枚举属性值,但一旦知道属性名称,就很容易获得属性值:

var abilityName, ability;

for(abilityName in window.abilities){
    ability = window.abilities[abilityName];
    if(ability.unlocked){
        $("#abilities").append(genAbilityCard(ability.name,ability.image,ability.description,ability.action));
    }
}

获取属性名称意味着您正在成功枚举属性。Javascript只是有点奇怪,
对于。。。在
works中。

的可能副本。这是一个老生常谈且回答得很好的问题,循环只会给你钥匙。可能是重复的。这是一个老生常谈且回答很好的问题,循环只会给你钥匙。效果很好,谢谢!我无法从据称存在的工作答案中得到任何东西,但这解决了它。很高兴能提供帮助!关于该解决方案的唯一警告是,它仅限于>=ES6。如果您需要使用=ES6。如果您需要使用
。有关在哪些环境中支持什么的更多详细信息,您可以查看;阿尔贝托的代码有效,但感谢您提供更多详细信息@它实际上取决于您的目标平台/目标浏览器。例如,IE11不支持ES6的大多数功能,包括。。。属于
。有关在哪些环境中支持什么的更多详细信息,请查看。