我被定向到 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/