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


151

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

그런 다음 "Enumerable properties는 for..in 루프에 의해 반복 될 수있는 속성입니다."라는 속성열거 및 소유권 페이지로 이동했습니다.

사전은 열거 가능한 것을 계산 가능한 것으로 정의하지만 그 의미를 실제로 시각화 할 수는 없습니다. 열거 가능한 것의 예를 얻을 수 있습니까?


당신은 무엇을 이해 for-in합니까?

대답에서 나는 그것을 얻었습니다 ..in은 객체의 열거 가능한 모든 속성을 for 문과 함께 사용할 수 있습니다.
Patrick

6
가장 간단한 의미는 다음과 같습니다. 속성이 for in루프에 의해 생성 될지 여부 (세부 사항을 알고 싶지 않거나 신경 쓰지 않는 사람들을 위해))
Tomasz Racia

답변:


158

열거 가능한 속성은 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 루프에 표시되지 않으므로 열거 할 수 없습니다. bar 또는 baz와 같은 속성 이름은 객체에서 console.log 할 수 있었기 때문에 열거 할 수 있습니까?
Patrick

5
이것은 완전히 정확하지 않습니다 : But, they are skipped (or not counted) by the for..in loop because they are not enumerable. 속성 Object.prototype은 열거 할 수 없기 때문에 프로토 타입 체인보다 상위에 있기 때문에 실제로 무시됩니다. 나도 getOwnPropertyNames()keys()자신이 아닌 객체의입니다 속성을 보여주지. 참고로, 많은 내장 속성이 열거 할 수 없으므로로 표시되지 않는 keys()것이 사실이지만 프로토 타입 체인을 통과하려면 추가 코드를 작성해야합니다.
Magnus

말 그대로, 열거 가능한 의미는 셀 수 없음을 의미합니다
Christian Matthew

49

객체를 통해 객체를 만들면 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 범위에서 이에 대해 설명합니다 .

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


흠, 공감과 공감. 확실히,이 답변에 대해 가치있는 투표가 필요한 것이 있으면 여기에 의견을 추가하십시오.
carpeliam

1
또 다른 답변은 다음과 같습니다. var o = {}; o [ 'foo'] = 0; // 열거 가능한 일반 Object.defineProperty (o, 'bar', {value : 1}); // nonenumerable, weird 열거 형을 명시 적으로 추가해야하는 이유 : false?
Patrick

5
@ 패트릭 (Patrick), 여기에 옵션이 있음을 분명히하기 위해 여기에 부분적으로 포함 시켰지만 청중에 따라 명시 적으로 결정하는 것은 확실한 결정이 될 수 있으므로 코드를 읽는 사람에게 명확합니다.
carpeliam

@carpeliam이 짧고 매우 명확한 설명에 감사드립니다. 나는 당신을
겪을

37

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

문자 그대로 "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"이라고 불렀을 것입니다.


5
마지막 줄에 찬성했습니다-실제로 그것이 실제로 불려 졌다면 아무도 그것에 대해 묻지 않을 것입니다. 내 질문을 제기하는 이유 무엇입니까? 왜 부동산을 열거 할 수 없도록 설정해야합니까? 배열의 길이 속성은 열거 할 수없는 속성의 예로 자주 사용되지만 왜 열거 형으로 설정할 수 없었습니까 (JavaScript 제한이 아니라 JavaScript에서 열거 할 수없는 이유는 무엇입니까? 첫 번째 장소)?
Chris

메이크업 : 혼다 모델 : 시민의 비밀 : 고양이 오줌은 다음이 옵션이 아니라는 것을 결정 이유를 내 질문에 명확히하려면 12 : 길이
크리스

흠 ... 내 질문에 대한 답을 찾았을 것입니다. Google 검색에서 "열거 된 데이터 유형의 의미는 무엇입니까?" 열거 된 데이터에는 유한 값 세트가 있습니다. 열거 된 데이터 형식은 해당 형식에 허용되는 값 또는 열거 된 값으로 구성됩니다. 정수 기반 열거 형의 경우 열거 된 각 값은 이름과 기본 숫자 값으로 구성됩니다. 따라서 올바르게 이해하면 무한 길이의 가능한 길이가 있으므로 무한한 수의 이름, 하나의 이름을 할당해야합니다 각 길이. 그 맞습니까?
Chris

첫 번째 질문을 다루면서 객체에 열거 할 수없는 속성을 설정하는 것은 약간 해킹입니다. 해당 객체의 내용을 찾을 수있는 유일한 방법은 코드와 코드베이스를 보는 것입니다. 매장 될 수 있음을 개발합니다. 따라서 일반적으로 사용하고 싶지 않습니다. 배열의 문자열 또는 요소의 문자 수를 제공하는 '.length'와 관련하여 'for ... in'을 사용하는 경우 포함하고 싶지 않은 것으로 추정됩니다. 왜 Js의 신들이 반드시 그렇게했는지 대답 할 수 없습니다. 그들은 이유 (가 에헴 우리의 이해를 넘어) 의견을.
Gabriel Kunkel

... 열거 형 데이터 유형에 대한 두 번째 질문에 대답 할 수는 없지만 시간이 있으면 꽤 오랫동안 씹을 수있는 것처럼 보입니다. :-)
Gabriel Kunkel

9

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

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

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 */


8

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

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

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

0

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


0

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


0

객체가 상속하는 내장 메소드는 열거 할 수 없지만 명시 적으로 언급하지 않는 한 코드가 객체에 추가하는 특성은 열거 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.