可枚举是什么意思?

我被引导到MDN的..在页面时,它说:“..在迭代对象的枚举属性。

然后我去了Enumerability和属性页面的所有权 ,它说:“可枚举的属性是那些可以通过for..in循环迭代的属性”。

字典定义枚举为可数,但我不能真正可视化的意思。 我可以得到一个枚举的例子吗?

一个枚举属性是一个可以包含在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]]属性标识为可枚举或不可枚举。 您可以将其视为属性描述符的一部分 :

 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属性。

这个条件是适当的,因为对象有更多的属性 ,尤其是inheritance :

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

这些属性中的每一个仍然存在于对象上 :

 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 

如果通过myObj = {foo: 'bar'}或其他东西创build一个对象,所有的属性都是可枚举的。 所以更简单的问题是,什么是不可枚举? 某些对象有一些不可枚举的属性,例如,如果调用Object.getOwnPropertyNames([]) (它会返回Object.getOwnPropertyNames([])的所有属性的数组,包括或不包含],它将返回['length'] ,其中包括数组的非枚举属性'length'。

你可以通过调用Object.defineProperty来创build你自己的不可枚举的属性:

 var person = { age: 18 }; Object.defineProperty(person, 'name', { value: 'Joshua', enumerable: false }); person.name; // 'Joshua' for (prop in person) { console.log(prop); }; // 'age' 

这个例子很大程度上借鉴了JavaScript中的非枚举属性 ,但是显示了一个枚举对象。 属性可以是或不可写的,可configuration的或可枚举的。 John Resig在ECMAScript 5对象和属性的范围内讨论了这个问题。

而且,还有一个关于为什么你想让属性不可枚举的Stack Overflow问题。

这比应该可视化的东西要枯燥得多。

所有属性名称都是“enumerable”。 当它被设置为false时, for..in方法将跳过该属性,假装它不存在。

在“enumerable”设置为false的对象上有很多属性,比如“valueOf”和“hasOwnProperty”,因为假设您不希望JavaScript引擎重复这些属性。

您可以使用Object.defineProperty方法创build您自己的不可枚举的属性:

  var car = { make: 'Honda', model: 'Civic', year: '2008', condition: 'bad', mileage: 36000 }; Object.defineProperty(car, 'mySecretAboutTheCar', { value: 'cat pee in back seat', enumerable: false }); 

现在,甚至有关于汽车的秘密这一事实是隐藏的。 当然,他们仍然可以直接访问该财产,并得到答案:

 console.log(car.mySecretAboutTheCar); // prints 'cat pee in back seat' 

但是,他们必须知道这个属性是先存在的,因为如果他们试图通过for..in或者Object.keys来访问它,它将会保持完全的秘密:

 console.log(Object.keys(car)); //prints ['make', 'model', 'year', 'condition', 'mileage'] 

他们应该把它叫做“forInble”。

如果你难以想像“可以枚举是什么意思?” 为什么不问自己,这是不可数的意味着什么?

我觉得有点像这样,一个不可估量的财产存在,但部分隐藏 ; 意思是不可数的是奇怪的。 现在你可以将枚举想象为剩下的东西 – 自从我们发现了Objects之后,我们曾经遇到过的更自然的属性。 考虑

 var o = {}; o['foo'] = 0; // enumerable, normal Object.defineProperty(o, 'bar', {value: 1}); // nonenumerable, weird 

现在在for..in ,想象它像伪代码

 for property in o: if not property enumerable continue // skip non-enumerable, "bar" else do /* whatever */ // act upon enumerable, "foo" 

您在JavaScript中input的循环的主体位于/* whatever */

我将写一个ENUMERABLE的行定义

Enumerable:指定属性是否可以在for / in循环中返回。

 var obj = {}; Object.defineProperties(data, { set1: {enumerable: true}, set2: {enumerable: false}, }); Object.keys(obj); // ["set1"] Object.getOwnPropertyNames(obj); // ["set1", "set2"] 

方法不是可枚举的; 或者更确切地说build在方法不是.. tho后search什么枚举手段到Java脚本; 它只是指一个属性属性.. ecma3中所有创build的对象都是可枚举的,并且ecma5可以现在定义它….就是这样..:D lol花了我一点才find答案; 但我相信它在David Flanagan的书中提到过..所以我想这意味着“隐藏”,或者不是“隐藏”在那些方法中没有显示在for循环中,因此是“隐藏”