열거 가능한 속성은 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
.
이 조건은 객체 가 더 많은 속성 , 특히 상속을 가지기 때문에 적용됩니다 .
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
for-in
합니까?