Ваш обратный вызов,
if (value !== true)
return value;
эквивалентен просто
return value;
в вашем случае, потому что ни один из элементов в вашем массиве не равен true
, поэтому value !== true
всегда выполняется.
Если вы измените его на
if (value !== false)
return value;
, он все равно будет выполнять return value;
для большинства элементов массива.Единственное исключение - false
, для которого ваша функция возвращает undefined
(поскольку не выполняется явный оператор return
).undefined
является ложным, поэтому он обрабатывается так же, как return false
на filter
(потому что filter
заботится только о том, вернул ли обратный вызов истинное или ложное значение).Таким образом, в конце концов, не возвращая значение, если элемент false
совпадает с return value
.
С другой стороны, если вы измените его на
if (value === true)
return value;
, тогда вашобратный вызов вернет true
, если текущий элемент true
, и вернет undefined
для любого другого значения.Чистым эффектом является удаление всех элементов, которые не являются true
(что в вашем случае является всеми элементами, потому что ваш входной массив не содержит true
).
Если вы хотите удалить ложные значения, вы можете простоскажем
arr.filter(value => { return value; })
// or:
arr.filter(value => value)
, потому что вы используете само значение в качестве условия: все, что выглядит ложно, удаляется filter
;все, что выглядит правдоподобно, сохраняется.
Если вы считаете, что это сбивает с толку, возможно, глядя на эту пользовательскую (и упрощенную) реализацию filter
, все проясняется:
function my_filter(arr, fn) {
var results = [];
for (var i = 0; i < arr.length; i++) {
if (fn(arr[i])) {
results.push(arr[i]);
}
}
return results;
}
// Usage would be something like:
console.log(my_filter([7, "ate", "", false, 9], value => value));