Почему для .. in получает все свойства, а для .. of не получает все значения?
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
будет синтаксической ошибкой, потому что они не то же самое, что свойства.
2 плюса
Вы пытаетесь обработать массив, как если бы он был объектом или ассоциативным массивом (а не JavaScript).
Это массив; нецелочисленные свойства никогда не будут значениями массива, что for...of
вам и даст.
Вы добавляете бонусные свойства к arr
объекту, но ожидать, что значение arr.foo
будет отображаться for..of
, будет похоже на ожидание значения, которое arr.length
будет отображаться.
Вопросы из категории :
- javascript Как определить, какой из указанных шрифтов был использован на веб-странице?
- javascript Валидация клиентской стороны ASP.Net
- javascript Длина объекта JavaScript
- javascript Получение текста из выпадающего списка
- javascript Скрипт входа со скрытыми кнопками
- javascript Как автоматически изменить размер текстовой области с помощью Prototype?
- javascript Удаление элементов с помощью Array.map в JavaScript
- javascript Прокрутка переполненных DIV с помощью JavaScript
- javascript API Карт Google - проблемы с классом GLatLngBounds
- javascript Проверка десятичных чисел в JavaScript - IsNumeric ()
- ecmascript-6 What's the difference between using "let" and "var" to declare a variable in JavaScript?
- ecmascript-6 Конечно, у ES6 + должен быть способ объединить два объекта javascript вместе, что это?
- ecmascript-6 Расширяющий класс JavaScript
- ecmascript-6 Что делают фигурные скобки в выражениях `var {...} = ...`?
- ecmascript-6 let keyword in the for loop
- ecmascript-6 check if function is a generator
- ecmascript-6 Разрушение в Node.JS
- ecmascript-6 Тип символа JavaScript: (не строковые ключи объекта)
- ecmascript-6 CSP-безопасные литералы шаблона ES6
- ecmascript-6 Использование параметра отдыха и оператора распространения в JavaScript