javascript - 可枚举是什么意思?

标签 javascript enumerable

我被定向到 MDN 的 for..in page当它说“for..in 遍历一个对象的可枚举属性。”

然后我去了Enumerability and ownership of properties page它说“可枚举属性是那些可以通过 for..in 循环迭代的属性。”

字典将 enumerable 定义为可数,但我无法真正想象这意味着什么。我可以举一个可枚举的例子吗?

最佳答案

可枚举属性是可以在 for..in 循环(或类似的属性迭代,如 Object.keys())中包含和访问的属性.

如果一个属性没有被识别为可枚举的,循环将忽略它在对象中。

var obj = { key: 'val' };

console.log('toString' in obj); // true
console.log(typeof obj.toString); // "function"

for (var key in obj)
    console.log(key); // "key"

属性由其自身标识为可枚举或不可枚举 [[Enumerable]] attribute .您可以将其视为 property's descriptor 的一部分:

var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, 'bar');

console.log(descriptor.enumerable); // true
console.log(descriptor.value);      // 1

console.log(descriptor);
// { value: 1, writable: true, enumerable: true, configurable: true }

for..in 循环然后遍历对象的属性名称。

var foo = { bar: 1, baz: 2};

for (var prop in foo)
    console.log(prop); // outputs 'bar' and 'baz'

但是,仅评估其语句 - console.log(prop); 在这种情况下 - 对于 [[Enumerable]] 属性为 true 的那些属性

此条件已到位,因为对象 have many more properties , 特别是 from inheritance :

console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]

这些属性中的每一个仍然是 exists on the object :

console.log('constructor' in foo); // true
console.log('toString' in foo);    // true
// etc.

但是,它们会被 for..in 循环跳过,因为它们不可枚举。

var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');

console.log(descriptor.enumerable); // false

关于javascript - 可枚举是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17893718/

相关文章:

javascript - 复选框(javascript)选择,第一项显示未定义?

javascript - 如何用 Angular 做多个 View 来支持页眉和侧边栏?

c# - IEnumerable 的性能

javascript - 使用正则表达式识别以引号开头但返回子字符串的字符串

javascript - 如何使用 UglifyJS 2 丑化 JavaScript?

javascript - dc.js + 根据数据集使图表动态化

c# - 自定义可枚举/集合何时有用?

c# - 为什么 Enumerable.All 对空序列返回 true?

c# - 如何使用 linq 将 'Y' 或 'N' 值转换为 bool 值?