Как работает "Number" в Array.prototype.filter(Number)? - программирование
Подтвердить что ты не робот

Как работает "Number" в Array.prototype.filter(Number)?

Я нашел этот классный способ использования метода Array.prototype.filter для удаления всех не чисел из строки, но я не совсем уверен, как он использует прототип Number для достижения этого:

var arr = '75number9';

arr.split(/[^\d]/).filter(Number); // returns [75, 9]

Когда я проверяю typeof Number, я возвращаюсь 'function'. Что здесь происходит?

Добавление к моей путанице заключается в том, что если я заменил Number на String, результаты будут одинаковыми. Он по-прежнему работает!

arr.split(/[^\d]/).filter(String); // returns [75, 9]

Array и Object в качестве параметров, с другой стороны, верните это:

["75", "", "", "", "", "", "9"]

Очень любопытно это понять!

4b9b3361

Ответ 1

Number - функция (конструктор), пытающаяся вернуть число. Дайте ему буквальное число или строку, которая может быть проанализирована на число, и она возвращает это число. Дайте ему что-то еще, и он вернет NaN.

Фильтр возвращает значения, для которых функция обратного вызова (в данном случае Number) возвращает правдивое значение. Номера, которые являются != 0 и != NaN, являются правдивыми и, таким образом, возвращаются.

Таким образом, ваш пример не возвращает значения 0:

var arr = '75number0';
arr.split(/[^\d]/).filter(Number);
// ["75"]

Обратите внимание, что значения возвращаемого массива все еще являются строками. Если мы хотим, чтобы они были числами, мы можем использовать map():

arr.split(/[^\d]/).filter(Number).map(Number);
// [75, 9]

В случае использования конструктора String вместо Number он работает, потому что String возвращает пустые строки для пустых строк, которые ему заданы, а пустые строки ('') являются ложными, как 0.

Ответ 2

> var arr = '75number9';
> arr = arr.split(/[^\d]/)
> arr
["75", "", "", "", "", "", "9"]

Number является конструктором для бокс-типа Number. По какой-то причине он также можно использовать как функцию:

> Number("")
0
> Number("75")
75

filter хранит элементы, в которых вызов вызывает значение без ложной информации. Когда пустая строка передается, она возвращает 0, что является ложным, поэтому пустые строки отбрасываются

String, когда задан строковый аргумент, ничего не возвращает, а возвращает. Поскольку "" false, filter снова отклоняет пустые строки.