В кой момент 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)));

РЕДАКТИРАНЕ: Има известно недоразумение относно моя въпрос: Наясно съм, че не използвам filter() във фрагмента. Това е така, защото единствената му цел е да покаже, че всички стойности преминават foo()-функцията, която по това време изглеждаше като противоречие с: [...] всички елементи, които преминават тест, реализиран от предоставената функция.

Разглеждайки Polyfill и описанието, сега разбирам защо работи по този начин. Благодаря ти, @adiga. Не разбрах напълно [...] връща стойност, която принуждава към true, тъй като английският не е първият ми език, но предполагам, че означава нещо подобно на [...] връща само верните стойности.


person leonheess    schedule 03.05.2019    source източник
comment
той проверява върнатата стойност и ако е вярна, тогава елементът преминава.   -  person Nina Scholz    schedule 03.05.2019
comment
Ясно е споменато в Описанието от Array.prototype.filter: filter() извиква предоставена функция за обратно извикване веднъж за всеки елемент в масив и конструира нов масив от всички стойности, за които обратното извикване връща стойност, която принуждава към true   -  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 a> . Коерсингът при ламбда и ванилните функции е идентичен, няма нищо различно.   -  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