isNaN
zurück wahr, wenn es Argument ist NaN
, das bedeutet, dass Ihre Filterfunktion NaN
hält, aber alles andere entfernt. Seine Länge ist nur 0
, wenn das Array keine NaNs enthielt. Für solch ein Array gibt Ihre Funktion false zurück:
console.log(every([4], isNaN)); // false
Das scheint das Gegenteil von dem zu sein, was Sie wollen. Sie haben Ihre Funktion every
aufgerufen, aber es verhält sich eher so, als sollte es some
heißen.
Für alles andere gibt es undefined
(statt true
) zurück, weil Sie in keinem anderen Fall eine Rückgabeanweisung haben. Ihre einzige return-Anweisung befindet sich in der if-Anweisung. Wenn die Bedingung nicht truthy ist, wird undefined
zurückgegeben. Ein Weg, um es zu beheben ist, es zu ändern, so dass sie das Ergebnis des Vergleichs gibt newArray.length === array.length
:
function every (array, compare){
var newArray = array.filter(
function (property){
return compare(property);
}
);
return newArray.length === array.length;
}
console.log(every([NaN, NaN, NaN], isNaN));
// → true
console.log(every([NaN, NaN, 4], isNaN));
// → false
Die Alternative ist, den Rückgabewert von compare
in Ihrem Filter Rückruf zu negieren (siehe @ Shomz Antwort) und dann return newArray.length === 0;
.
Was passiert, wenn die 'if' läuft nicht? Eine Funktion gibt 'undefined' standardmäßig zurück ... – elclanrs
'Ich soll wahr und falsch werden '- wann kehrt deine Funktion' wahr 'zurück? – Adam
Beachten Sie, dass das 'return' innerhalb des' filters' nicht von der 'every'-Funktion zurückkommt, es bestimmt nur das Filterergebnis (für ein einzelnes Array-Element). – Thilo