В какой момент Array.prototype.filter() проверяет ложные значения?

Я наткнулся на эту замечательную функцию для удаления ложные значения из массива:

let other = array.filter(item => item);

Но я не понимаю, как это может работать. Насколько я понимаю объяснение Array​ .prototype​.filter(), найденный в MDN:

Метод filter() создает новый массив со всеми элементами, прошедшими проверку, реализованную предоставленной функцией.

Следующий код должен быть таким же, как приведенный выше (и он обеспечивает тот же результат):

function foo(item) {
  return item;
}

let other = array.filter(foo);

Но foo() просто возвращает все ложные значения, как вы можете видеть в приведенном ниже фрагменте (как и ожидалось). Когда происходит фильтрация, если ложные значения ДЕЙСТВИТЕЛЬНО проходят предоставленную функцию?

let array = ['foo', undefined, false, 'bar'];

function foo(item) {
  return item;
}

array.forEach(item => console.log(foo(item)));

EDIT: по моему вопросу возникло некоторое недопонимание: я знаю, что не использую filter() во фрагменте. Это связано с тем, что его единственная цель — показать, что все значения проходят foo()-функцию, что в то время казалось противоречием: [...] всем элементам, проходящим тест, реализованный предоставленной функцией.

Глядя на Polyfill и описание, я теперь понимаю, почему он работает так, как работает. Спасибо, @adiga. Я не совсем понял, что [...] возвращает значение, которое приводит к true, поскольку английский не является моим родным языком, но я думаю, что это означает что-то вроде [...] возвращает только истинные значения.


person leonheess    schedule 03.05.2019    source источник
comment
он проверяет возвращаемое значение, и если оно истинно, то элемент проходит.   -  person Nina Scholz    schedule 03.05.2019
comment
Это четко указано в Описании of Array.prototype.filter: filter() вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив всех значений, для которых обратный вызов возвращает значение, приводящее к истинности   -  person adiga    schedule 03.05.2019
comment
@Seblor Это специально. Это показывает, что foo() вообще не меняет значения.   -  person leonheess    schedule 03.05.2019
comment
Проверяли ли вы Polyfill filter на той же странице, на которую ссылается вопрос - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/   -  person Nikhil Aggarwal    schedule 03.05.2019
comment
@ MiXT4PE Я действительно неправильно понял то, что ты неправильно понял. Ваша функция foo сама по себе буквально ничего не делает. Однако отправка его в качестве параметра функции filter отфильтровывает ложные значения.   -  person Seblor    schedule 03.05.2019
comment
Но foo() просто возвращает все ложные значения, как вы можете видеть в приведенном ниже фрагменте (как и ожидалось). ... Нет! В своем фрагменте вы используете forEach, вы НЕ фильтруете! Обратный вызов foo работает точно так же, как и лямбда! jsfiddle.net/12cymk3j . Принуждение в лямбда-функциях и ванильных функциях идентично, ничем не отличается.   -  person briosheje    schedule 03.05.2019
comment
Я не вижу, чтобы вы использовали функцию «фильтр» в своем фрагменте кода.   -  person Saurabh Chouhan    schedule 03.05.2019
comment
все элементы, прошедшие проверку, реализованную предоставленной функцией, означают только все элементы, для которых предоставленная функция возвращает истинное значение. Это то, что все здесь пытаются вам сказать!   -  person Gerardo Furtado    schedule 03.05.2019
comment
@GerardoFurtado О, наверное, тогда я просто не понял этого предложения. Благодарю вас!   -  person leonheess    schedule 03.05.2019


Ответы (1)


Я не уверен, правильно ли я понял вопрос, но filter возвращает только те значения, для которых обратный вызов фильтра возвращает значение, которое приводится к true (т.е. не является ложным).

Вот почему для фильтрации ложных значений просто требуется, чтобы функция фильтра возвращала само значение.

(Обратный вызов также может явно возвращать логическое значение с !!value, что будет делать то же самое.)

person Christoph Burschka    schedule 03.05.2019
comment
В приведенном им примере используется не фильтр, а forEach. Фильтрация работает в обоих примерах, как и ожидалось, нет ничего неправильного в использовании ссылки на функцию в качестве функции вместо лямбда, результат будет одинаковым из-за возвращаемого значения, которое принудительно используется в обоих случаях. jsfiddle.net/12cymk3j - person briosheje; 03.05.2019