Почему для .. in получает все свойства, а для .. of не получает все значения?

javascript ecmascript-6

97 просмотра

2 ответа

Я проверил следующий код:

arr = [3, 5, 7];

arr.foo = "hello";

arr["boo"] ="moo"


for (i in arr) {
   console.log(i);
}

for (i of arr) {
   console.log(i); 
}

for .. in получает все свойства массива.

for (i in arr) {
   console.log(i); 
}

возвращает:

0 
1 
2 
foo 
boo

но для .. из не получает все значения

  for (i of arr) {
       console.log(i); 
    }

возвращает:

3
5
7

Какова техническая причина этого различия и почему это явное несоответствие было принято как поведение по умолчанию?

Автор: Eduard Florinescu Источник Размещён: 12.11.2019 09:03

Ответы (2)


5 плюса

Решение

for (... in ...)Синтаксис доступен для использования на любом объекте, и перебрать все свойства этого объекта. С технической точки зрения, этот цикл будет перебирать любое свойство в объекте, которое внутренне определено с его [[Enumerbale]]свойством, установленным в true.

for (... of ...)Синтаксис является новым ES6 и специфичен для коллекций , а не все объекты. Он предоставляет сокращенный способ перебора элементов коллекции, вместо того, чтобы использовать простой forили whileцикл с индексом. Таким образом он будет перебирать любые элементы любой коллекции, у которой есть [Symbol.iterator]свойство.

Это не «несоответствие», это два разных оператора, предназначенных для двух разных целей. Я могу понять, как может выглядеть arr["boo"] ="moo"добавление элемента в массив, поскольку можно получить доступ к элементам массива с помощью аналогичного синтаксиса, как в arr[0]. Но легко убедиться, что они не одинаковы по сути - arr["boo"] ="moo"вы создаете свойство, к которому также можно получить доступ arr.boo, но попытка получить доступ к элементам массива, скажем, arr.0будет синтаксической ошибкой, потому что они не то же самое, что свойства.

Автор: Sam Hanley Размещён: 07.12.2015 02:16

2 плюса

Вы пытаетесь обработать массив, как если бы он был объектом или ассоциативным массивом (а не JavaScript).

Это массив; нецелочисленные свойства никогда не будут значениями массива, что for...ofвам и даст.

Вы добавляете бонусные свойства к arrобъекту, но ожидать, что значение arr.fooбудет отображаться for..of, будет похоже на ожидание значения, которое arr.lengthбудет отображаться.

Автор: Paul Roub Размещён: 07.12.2015 02:17
Вопросы из категории :
32x32