- Почему for работает, а forEach не работает?
- 3 ответа 3
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками javascript foreach for или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Почему не работает код с циклом forEach?
- Все способы перебора массива в JavaScript
- Содержание:
- I. Перебор настоящих массивов
- 1. Метод forEach и родственные методы
- 2. Цикл for
- 3. Правильное использование цикла for. in
- 4. Цикл for. of (неявное использование итератора)
- 5. Явное использование итератора
- II. Перебор массивоподобных объектов
- 1. Использование способов перебора настоящих массивов
- 2. Преобразование в настоящий массив
- Array.prototype.forEach()
- Синтаксис
- Параметры
- Возвращаемое значение
- Описание
Почему for работает, а forEach не работает?
У меня есть функция, которая дезактивирует инпуты:
И есть функция, которая их активирует:
Но если я пытаюсь переписать функцию дезактивации на forEach, то она не работает:
3 ответа 3
Потому что атрибут не синхронизируется со свойством. Менять атрибут неправильно, надо менять свойство.
В таких случаях, первое место, куда надо смотреть, — консоль браузера и ошибки в ней.
Дело не в методе forEach.
Метод setAttribute() указывает атрибуты по правилам XHTML. Они предполагают формат атрибут=’значение’.
Поэтому вы можете использовать forEach, однако метод setAttribute должен иметь вид setAttribute(‘disabled’, ‘disabled’)
Всё ещё ищете ответ? Посмотрите другие вопросы с метками javascript foreach for или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.15.40479
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник
Почему не работает код с циклом forEach?
0xD34F, смотреть я умею) а вот не умею читать ошибки, ну вот пишет в консоли:
Uncaught TypeError: images.forEach is not a function at index.js:6
Ну вот что можно понять с сообщения «is not a function»?
а ничего
Если б писало сообщение:
unxpected token «)»
То понятно что лишняя скобка, а из моего сообщения в консоли вообще ничего не понятно..
Мерзкая, наглая ложь. Будь это правдой, вы, как минимум, спрашивали бы о причине возникновения конкретной ошибки.
что можно понять с сообщения «is not a function»?
Очень печально, когда люди так разговаривают друг с другом, еще более печально, когда это делает куратор тэга, поскольку это дает пример другим — вот оно нормальное общение — загнобить человека только потому, что он начинающий и не владеет навыками понимания ошибок.
Действительно программирование что-то настолько важное, что требует подобного стиля общения?
Веб-форум — платформа для общения между пользователями интернета на одну тему или на несколько тем (зависит от специализации форума).
q&a — страница, по типу вопрос-ответ.
3. В процессе создания вопроса пользователь Сервиса обязан:
3.4. Помнить о том, что сервис вопросов и ответов «Тостер» не является форумом, чатом или социальной сетью. Следует избегать употребления речевых оборотов, характерных для этих типов ресурсов. Вопрос и его описание не должны содержать приветствий и прочих «лирических отступлений».
Я не задавал вопрос и не писал описание к вопросу. Вам стоит внимательней прочитать этот пункт.
5.1 — анимэшник оскорбление? Если человек любит фильмы и его называет киноман или человек очень любит играть в игры, его называют задрот. Киноман и задрот оскорбления?
5.14 — ну тут такое, ты ведь тоже пишешь получается флуд, когда мне отвечаешь. Тут непродуманность этого лендинга, решение вижу в два варианта. Реализация личных сообщений или создание обертки для сообщения тегом оффтоп.
8.2 — опять же, проблема исходит от того, что нет личных сообщений, это раз. Три, это то, что мои сообщения модератору не есть обязательными к ответу.
Модератор может воспользоваться пунктом правил 8.3 и это дает ему право, не отслеживать мои дискуссии, раз я нарушил правило 5.1. Если ты мне отвечаешь, то я ничего не нарушил.
И раз уж на то пошло, почему не описаны в каждом пункте, на сколько дается бан.
Источник
Все способы перебора массива в JavaScript
Содержание:
I. Перебор настоящих массивов
1. Метод forEach и родственные методы
Если ваш проект рассчитан на поддержку возможностей стандарта ECMAScript 5 (ES5), вы можете использовать одно из его нововведений — метод forEach.
В общем случае использование forEach требует подключения библиотеки эмуляции es5-shim для браузеров, не имеющих нативной поддержки этого метода. К ним относятся IE 8 и более ранние версии, которые до сих пор кое-где еще используются.
К достоинствам forEach относится то, что здесь не нужно объявлять локальные переменные для хранения индекса и значения текущего элемента массива, поскольку они автоматически передаются в функцию обратного вызова (колбек) в качестве аргументов.
Если вас беспокоят возможные затраты на вызов колбека для каждого элемента, не волнуйтесь и прочитайте это.
forEach предназначен для перебора всех элементов массива, но кроме него ES5 предлагает еще несколько полезных методов для перебора всех или некоторых элементов плюс выполнения при этом каких-либо действий с ними:
- every — возвращает true , если для каждого элемента массива колбек возвращает значение приводимое к true .
- some — возвращает true , если хотя бы для одного элемента массива колбек возвращает значение приводимое к true .
- filter — создает новый массив, включающий те элементы исходного массива, для которых колбек возвращает true .
- map — создает новый массив, состоящий из значений возращаемых колбеком.
- reduce — сводит массив к единственному значению, применяя колбек по очереди к каждому элементу массива, начиная с первого (может быть полезен для вычисления суммы элементов массива и других итоговых функций).
- reduceRight — работает аналогично reduce, но перебирает элементы в обратном порядке.
2. Цикл for
Старый добрый for рулит:
Если длина массива неизменна в течение всего цикла, а сам цикл принадлежит критическому в плане производительности участку кода (что маловероятно), то можно использовать «более оптимальную» версию for с хранением длины массива:
Теоретически этот код должен выполняться чуть быстрее, чем предыдущий.
Если порядок перебора элементов не важен, то можно пойти еще дальше в плане оптимизации и избавиться от переменной для хранения длины массива, изменив порядок перебора на обратный:
Тем не менее, в современных движках JavaScript подобные игры с оптимизацией обычно ничего не значат.
3. Правильное использование цикла for. in
Если вам посоветуют использовать цикл for. in , помните, что перебор массивов — не то, для чего он предназначен. Вопреки распространенному заблуждению цикл for. in перебирает не индексы массива, а перечислимые свойства объекта.
Тем не менее, в некоторых случаях, таких как перебор разреженных массивов, for. in может оказаться полезным, если только соблюдать при этом меры предосторожности, как показано в примере ниже:
В данном примере на каждой итерации цикла выполняется две проверки:
- то, что массив имеет собственное свойство с именем key (не наследованное из его прототипа).
- то, что key — строка, содержащая десятичную запись целого числа, значение которого меньше 4294967294 . Откуда берется последнее число? Из определения индекса массива в ES5, из которого следует, что наибольший индекс, который может иметь элемент в массиве: (2^32 — 2) = 4294967294 .
Конечно, такие проверки отнимут лишнее время при выполнении цикла. Но в случае разреженного массива этот способ более эффективен, чем цикл for , поскольку в этом случае перебираются только те элементы, которые явно определены в массиве. Так, в примере выше будет выполнено всего 3 итерации (для индексов 0, 10 и 10000) — против 10001 в цикле for .
Чтобы не писать такой громоздкий код проверок каждый раз, когда требуется перебор массива, можно оформить его в виде отдельной функции:
Тогда тело цикла из примера значительно сократится:
Рассмотренный выше код проверок является универсальным, подходящим для всех случаев. Но вместо него можно использовать более короткую версию, хотя формально и не совсем правильную, но, тем не менее, подходящую для большинства случаев:
4. Цикл for. of (неявное использование итератора)
ES6, пока все еще пребывающий в статусе черновика, должен ввести в JavaScript итераторы.
Итератор — это реализуемый объектом протокол, который определяет стандартный способ получения последовательности значений (конечной или бесконечной).
Итератор — это объект, в котором определен метод next() — функция без аргументов, возвращающая объект с двумя свойствами:
- done ( boolean ) — принимает значение true , если итератор достиг конца итерируемой последовательности. В противном случае имеет значение false .
- value — определяет значение, возвращаемое итератором. Может быть не определено (отсутствовать), если свойство done имеет значение true .
Многие встроенные объекты, в т.ч. настоящие массивы, имеют итераторы по умолчанию. Простейший способ применения итератора в настоящих массивах — использовать новую конструкцию for. of .
Пример использования for. of :
В приведенном примере цикл for. of неявно вызывает итератор объекта Array для получения каждого значения массива.
5. Явное использование итератора
Итераторы можно также использовать и явно, правда, в этом случае код становится значительно сложнее, по сравнению с циклом for. of . Выглядит это примерно так:
В данном примере метод Array.prototype.entries возвращает итератор, который используется для вывода значений массива. На каждой итерации entry.value содержит массив вида [ключ, значение] .
II. Перебор массивоподобных объектов
Кроме настоящих массивов, в JavaScript встречаются также массивоподобные объекты. С настоящими массивами их роднит то, что они имеют свойство length и свойства с именами в виде чисел, соответствующие элементам массива. В качестве примеров можно назвать DOM коллекции NodeList и псевдомассив arguments , доступный внутри любой функции/метода.
1. Использование способов перебора настоящих массивов
Как минимум большинство, если не все, способы перебора настоящих массивов могут быть применены для перебора массивоподобных объектов.
Конструкции for и for. in могут быть применены к массивоподобным объектам точно тем же путем, что и к настоящим массивам.
forEach и другие методы Array.prototype также применимы к массивоподобным объектам. Для этого нужно использовать вызов Function.call или Function.apply.
Например, если вы хотите применить forEach к свойству childNodes объекта Node , то это делается так:
Для удобства повторного использования этого приема, можно объявить ссылку на метод Array.prototype.forEach в отдельной переменной и использовать ее как сокращение:
Если в массивоподобном объекте имеется итератор, то его можно использовать явно или неявно для перебора объекта таким же способом, как и для настоящих массивов.
2. Преобразование в настоящий массив
Есть также еще один, очень простой, способ перебора массивоподобного объекта: преобразовать его в настоящий массив и использовать любой из рассмотренных выше способов перебора настоящих массивов. Для преобразования можно использовать универсальный метод Array.prototype.slice , который может быть применен к любому массивоподобному объекту. Делается это очень просто, как показано в примере ниже:
Например, если вы хотите преобразовать коллекцию NodeList в настоящий массив, вам нужен примерно такой код:
Источник
Array.prototype.forEach()
Метод forEach() выполняет указанную функцию один раз для каждого элемента в массиве.
Источник этого интерактивного примера хранится в GitHub. Если вы хотите внести вклад в проект интерактивных примеров, пожалуйста, клонируйте https://github.com/mdn/interactive-examples и отправьте нам pull request.
Синтаксис
Параметры
Возвращаемое значение
Описание
Метод forEach() выполняет функцию callback один раз для каждого элемента, находящегося в массиве в порядке возрастания. Она не будет вызвана для удалённых или пропущенных элементов массива. Однако, она будет вызвана для элементов, которые присутствуют в массиве и имеют значение undefined .
Функция callback будет вызвана с тремя аргументами:
- значение элемента (value)
- индекс элемента (index)
- массив, по которому осуществляется проход (array)
Если в метод forEach() был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае, в качестве значения this будет использоваться значение undefined . В конечном итоге, значение this , наблюдаемое из функции callback , определяется согласно обычным правилам определения this , видимого из функции .
Диапазон элементов, обрабатываемых методом forEach() , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода forEach() , не будут посещены функцией callback . Если существующие элементы массива изменятся, значения, переданные в функцию callback , будут значениями на тот момент времени, когда метод forEach() посетит их; удалённые элементы посещены не будут. Если уже посещённые элементы удаляются во время итерации (например, с помощью shift() ), последующие элементы будут пропущены. ( Смотри пример ниже )
Примечание: Не существует способа остановить или прервать цикл forEach() кроме как выбрасыванием исключения. Если вам необходимо такое поведение, метод forEach() неправильный выбор.
Досрочное прекращение может быть достигнуто с:
Если нужно протестировать элементы массива на условие и нужно вернуть булево значение, вы можете воспользоваться методами every() , some() , find() или findIndex() .
Метод forEach() выполняет функцию callback один раз для каждого элемента массива; в отличие от методов every() и some() , он всегда возвращает значение undefined .
Источник