Я пытаюсь понять / осмыслить цикл .forEach в Javascript.
Теперь я понимаю это просто
let numberArray = [1, 2, 3, 4]
numberArray.forEach(x => {
console.info(x)
})Как и ожидалось, он вернет результат
1
2
3
4
Теперь, поскольку forEach - это функция, я решил что-то вернуть и сохранить его значение.
let numberArray = [1, 2, 3, 4]
let newNum = numberArray.forEach(x => x)
console.info(newNum)Это возвращает undefined, когда я явно что-то возвращаю, и это снова функция.
Может кто-нибудь сказать мне, что мне здесь не хватает? Я имею в виду, что я фон цикла forEach
[Обновлять:] Я знаю много других способов достичь своей цели, мне больше интересно узнать больше об этом поведении для forEach
@soktinpk Я знаю о карте, но просто возился и оценивал результат JS
.forEach не использует возвращаемых значений и ничего не возвращает. Для этого нужен .map.
forEach - это Function, возвращающий void 0 (или, на самом деле, undefined). Он действует на array, возвращая ничего такого. Вы, вероятно, хотели вместо этого map. Если вы знакомы с любым другим язык без слабой типизации, это функция / метод void, поэтому вы пытаетесь зарегистрировать результат функции void.
Вы хотите, чтобы newNum был суммой чисел в массиве? Если да, то взгляните на: Array.prototype.reduce.
Возможный дубликат Для каждого по массиву в JavaScript?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Array#forEach ничего не возвращает, он выполняет операцию с каждым элементом в указанном массиве, а затем возвращает undefined.
Вероятно, вы ищете Array#map, который, как и Array#forEach, выполняет операцию с каждым элементом в некотором массиве, а затем возвращает результат в виде нового массива.
let numberArray = [1, 2, 3, 4];
let newNum = numberArray.map(x => x);
console.info(newNum);«Как и ожидалось, результат вернется» - нет, не возвращалось. Он был зарегистрирован в консоли функцией console.info.
Большое спасибо за ваш ответ. Если вы также можете ответить на следующие вопросы, forEach принимает обратный вызов, и я возвращаю что-то в этом обратном вызове.
@VarunBindal Он ничего не возвращает. И даже если вы это сделаете и вернете что-то, это не будет включено в результат, оно все равно вернет undefined. Array#forEach был предназначен для перебора массива и выполнения некоторых внешних или изменяющих операций. Это изменит существующий массив. Он не вернет новый. Вы можете прочитать больше на: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
@VarunBindal аргумент forEach (обратный вызов) является (как и сам метод forEach) функцией void, что означает, что ее результатом является неиспользованный в коде прототипа forEach. Короче говоря, возврат x или не возвращение чего-либо в обратном вызове foreach в равной степени подействует на него. Этот метод был предназначен для итерации ссылка (если вы не работаете с массивом примитивов, как вы) исходного массива, изменяя это, но без, возвращающего новый.
@briosheje Это именно то, что я искал. Понимание forEach получило довольно много ответов / комментариев, предлагающих альтернативу. По-прежнему рад, что люди ответили и внесли свой вклад.
@VarunBindal, то лучшее, что вы можете (всегда) сделать в образовательных целях, - это взять официальную ссылку MDN (как было подтверждено любезным пользователем выше), перейти в раздел «polyfill» и увидеть реализацию полифила, вот прямая ссылка на div: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. Как видите, вы можете найти его полную реализацию, это должно помочь вам правильно понять, что происходит за forEach. Чтобы ответить на ваш вопрос, прочтите пункт 8 («return undefined»).
forEach ничего не возвращает. Он использует каждое значение в массиве в качестве первого аргумента для вызова предоставляемой вами функции.
В этом случае вы получите тот же массив обратно с помощью forEach:
let array = [1, 2, 3, 4];
array.forEach(i => {
i => i;
});
console.info(array);
Обратите внимание, что вы будете использовать .forEach () для итерации по коллекциям и .map () для фактического создания нового массива.
Обновлено:
Для пояснения еще один пример:
let array = [1, 2, 3, 4];
var myNumber = 1;
array.forEach(i => {
myNumber = i;
});
console.info(myNumber); // 4
Здесь на каждой итерации значение переменной myNumber будет изменяться на значение i. В конце итераций значением myNumber будет значение последнего элемента массива. Надеюсь, поможет!
Что такое i => i;? Он просто объявляет анонимную стрелочную функцию и немедленно отбрасывает ее для каждого элемента в массиве.
Согласитесь, это довольно бесполезно. Но вопрос ОП был именно об этом. Тем не менее, я уже указывал, что использовать map для создания нового массива и использовать .forEach только для итерации существующего.
Если вы уже регистрируете array, вам даже не нужно ставить foreach. Я бы посоветовал вам повторно изучить / протестировать свой код, поскольку добавление, которое вы предоставили, в настоящее время ничего не делает ни для того, чтобы сделать forEach более понятным, ни для того, чтобы предоставить рабочий пример.
честно говоря, я думаю, что i => i; здесь бесполезен и даже не актуален, но спасибо за ответ. Я не тот, кто отрицает ваш ответ здесь :)
Я согласен с вами, это довольно бесполезно, я обновил свой пост, чтобы объяснить для каждого больше.
Частичное голосование за то, что тот, кто проголосовал против, на самом деле не думает объективно с точки зрения полезных ответов. Это, и я думаю, что это на самом деле лучше объясняет, что делает #forEach, чем принятый ответ, который фокусируется на #map.
@LawrenceJohnson Ответ отредактирован. Раньше ответ был расплывчатым. Отмеченный ответ имеет лучшее объяснение в комментарии. Проголосовал и за этот ответ :)
Что работа
map, а неforEach:Array.prototype.map.