Понимание forEach в Javascript

Я пытаюсь понять / осмыслить цикл .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

Что работа map, а не forEach: Array.prototype.map.

ibrahim mahrir 15.12.2018 17:30

@soktinpk Я знаю о карте, но просто возился и оценивал результат JS

anny123 15.12.2018 17:30
.forEach не использует возвращаемых значений и ничего не возвращает. Для этого нужен .map.
Alnitak 15.12.2018 17:30
forEach - это Function, возвращающий void 0 (или, на самом деле, undefined). Он действует на array, возвращая ничего такого. Вы, вероятно, хотели вместо этого map. Если вы знакомы с любым другим язык без слабой типизации, это функция / метод void, поэтому вы пытаетесь зарегистрировать результат функции void.
briosheje 15.12.2018 17:31

Вы хотите, чтобы newNum был суммой чисел в массиве? Если да, то взгляните на: Array.prototype.reduce.

ibrahim mahrir 15.12.2018 17:32

Возможный дубликат Для каждого по массиву в JavaScript?

amn 15.12.2018 17:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
958
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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 принимает обратный вызов, и я возвращаю что-то в этом обратном вызове.

anny123 15.12.2018 17:36

@VarunBindal Он ничего не возвращает. И даже если вы это сделаете и вернете что-то, это не будет включено в результат, оно все равно вернет undefined. Array#forEach был предназначен для перебора массива и выполнения некоторых внешних или изменяющих операций. Это изменит существующий массив. Он не вернет новый. Вы можете прочитать больше на: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

kind user 15.12.2018 17:39

@VarunBindal аргумент forEach (обратный вызов) является (как и сам метод forEach) функцией void, что означает, что ее результатом является неиспользованный в коде прототипа forEach. Короче говоря, возврат x или не возвращение чего-либо в обратном вызове foreach в равной степени подействует на него. Этот метод был предназначен для итерации ссылка (если вы не работаете с массивом примитивов, как вы) исходного массива, изменяя это, но без, возвращающего новый.

briosheje 15.12.2018 17:41

@briosheje Это именно то, что я искал. Понимание forEach получило довольно много ответов / комментариев, предлагающих альтернативу. По-прежнему рад, что люди ответили и внесли свой вклад.

anny123 15.12.2018 17:43

@VarunBindal, то лучшее, что вы можете (всегда) сделать в образовательных целях, - это взять официальную ссылку MDN (как было подтверждено любезным пользователем выше), перейти в раздел «polyfill» и увидеть реализацию полифила, вот прямая ссылка на div: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. Как видите, вы можете найти его полную реализацию, это должно помочь вам правильно понять, что происходит за forEach. Чтобы ответить на ваш вопрос, прочтите пункт 8 («return undefined»).

briosheje 15.12.2018 17:45

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;? Он просто объявляет анонимную стрелочную функцию и немедленно отбрасывает ее для каждого элемента в массиве.

ibrahim mahrir 15.12.2018 17:34

Согласитесь, это довольно бесполезно. Но вопрос ОП был именно об этом. Тем не менее, я уже указывал, что использовать map для создания нового массива и использовать .forEach только для итерации существующего.

dotnetdev4president 15.12.2018 17:36

Если вы уже регистрируете array, вам даже не нужно ставить foreach. Я бы посоветовал вам повторно изучить / протестировать свой код, поскольку добавление, которое вы предоставили, в настоящее время ничего не делает ни для того, чтобы сделать forEach более понятным, ни для того, чтобы предоставить рабочий пример.

briosheje 15.12.2018 17:37

честно говоря, я думаю, что i => i; здесь бесполезен и даже не актуален, но спасибо за ответ. Я не тот, кто отрицает ваш ответ здесь :)

anny123 15.12.2018 17:38

Я согласен с вами, это довольно бесполезно, я обновил свой пост, чтобы объяснить для каждого больше.

dotnetdev4president 15.12.2018 17:50

Частичное голосование за то, что тот, кто проголосовал против, на самом деле не думает объективно с точки зрения полезных ответов. Это, и я думаю, что это на самом деле лучше объясняет, что делает #forEach, чем принятый ответ, который фокусируется на #map.

Lawrence Johnson 15.12.2018 18:02

@LawrenceJohnson Ответ отредактирован. Раньше ответ был расплывчатым. Отмеченный ответ имеет лучшее объяснение в комментарии. Проголосовал и за этот ответ :)

anny123 15.12.2018 23:24

Другие вопросы по теме