[javascript] 열거 가능한 것은 무엇을 의미합니까?

MDN의 for..in 페이지 에서 “for..in은 객체의 열거 가능한 속성을 반복합니다.”라고 말했습니다.

그런 다음 “Enumerable properties는 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.

이 조건은 객체 가 더 많은 속성 , 특히 상속을 가지기 때문에 적용됩니다 .

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'}모든 속성을 열거 할 수 있습니다. 따라서 더 쉬운 질문은 열거 할 수없는 것입니다. 특정 객체에는 열거 할 수없는 속성이 있습니다. 예를 들어 Object.getOwnPropertyNames([])([]에서 열거 할 수 있거나없는 모든 속성의 배열을 반환하는) 호출 하면 배열의 열거 ['length']할 수없는 속성 인 ‘length’가 포함 된 을 반환합니다 . .

다음을 호출하여 열거 할 수없는 고유 한 속성을 만들 수 있습니다 Object.defineProperty.

var person = { age: 18 };
Object.defineProperty(person, 'name', { value: 'Joshua', enumerable: false });

person.name; // 'Joshua'
for (prop in person) {
  console.log(prop);
}; // 'age'

이 예제 는 JavaScript의 열거 불가능한 속성을 많이 사용 하지만 열거 된 객체를 보여줍니다. 속성은 쓰기 가능, 구성 가능 또는 열거 가능할 수 있습니다. John Resig는 ECMAScript 5 Objects and Properties 범위에서 이에 대해 설명합니다 .

그리고 왜 속성을 열거 불가능하게 만들고 싶어하는지 에 대한 스택 오버플로 질문이 있습니다 .


답변

시각화해야 할 것보다 훨씬 지루합니다.

문자 그대로 “enumerable”이라는 모든 속성에 속성이 있습니다. false로 설정되면 for..in메소드는 해당 특성을 건너 뛰고 존재하지 않는 척합니다.

“valueOf”및 “hasOwnProperty”와 같이 “enumerable”이 false로 설정된 객체에는 많은 속성이 있습니다. 왜냐하면 JavaScript 엔진이이를 반복하는 것을 원하지 않기 때문입니다.

다음 Object.defineProperty방법을 사용하여 열거 할 수없는 고유 한 속성을 만들 수 있습니다 .

  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']

그들은 방금 “forInAble”이라고 불렀을 것입니다.


답변

“열거 가능하다는 것은 무엇을 의미합니까?”를 시각화하는 데 어려움이있는 경우 왜 스스로에게 물어 보지 않겠 습니까?

나는 이것과 같은 것을 생각한다. 셀 수없는 속성 이 존재 하지만 부분적으로 숨겨져있다 . 수 없는 것은 이상한 것입니다. 이제 객체 를 발견 한 이후에 우리가 겪었던 자연적 속성 인 남은 것으로 열거 할 수 있다고 상상할 수 있습니다 . 치다

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 로 입력 한 루프의 본문 이/* whatever */


답변

ENUMERABLE의 한 줄 정의를 작성 하겠습니다.

Enumerable: 특성을 for / in 루프로 리턴 할 수 있는지 여부를 지정합니다.

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


답변

방법은 열거 할 수 없습니다. 또는 오히려 내장 메소드가 아닙니다.. 자바 스크립트에 열거 가능한 의미가 무엇인지 검색 한 후 ; 단지 속성 속성을 참조합니다. ecma3에서 생성 된 모든 객체는 열거 할 수 있으며, ecma5 u는 이제 그것을 정의 할 수 있습니다 …. 그게 .. : D lol은 답을 찾기 위해 약간의 시간이 걸렸습니다. 그러나 나는 그것이 David Flanagan의 책에서 이야기되었다고 생각합니다. 그래서 나는 그것이 “숨겨진”또는 “숨겨진”을 의미한다고 생각합니다.


답변

열거 형 데이터 유형, 다른 숫자에 해당하는 객체의 구조를 생각해보십시오. 열거 가능한 것으로 무언가를 선언하는 것은 특정 숫자에 해당한다고 선언하여 객체의 셀 수있는 구성 요소를 나타내는 사전에 해당 위치를 부여 할 수 있습니다. 간단히 말해서 객체를 열거 가능하게 만드는 것은 컴파일러에게 “이 속성이 중요합니다.이 객체에서 데이터를 확인할 때 이것을보고 싶습니다.”라고 말하는 것과 같습니다.