Ответ 1
Чтобы ответить на вопрос, почему util.isArray
существует, нам нужно немного урок истории.
Когда он был сначала добавлен в node, он сделал немного больше, чем вызов Array.isArray
.
function isArray (ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
Это была локальная функция в utils и на самом деле не была экспортирована до v0.6.0.
В этом виде util.isArray
обрабатывается случай, который Array.isArray
не выполняет:
> x = [1,2,3]
[ 1, 2, 3 ]
> y = Object.create(x)
[ , , ]
> Array.isArray(y)
false
> Array.isArray(Object.getPrototypeOf(y))
true
Здесь обсуждается здесь об этом поведении util.isArray
, и консенсус в том, что это поведение на самом деле плохо, потому что y
на самом деле не является a Array
.
Таким образом, функция проверки прототипа была скоро удалена и заменена с помощью проверки, которая использовала как Array.isArray
, так и проверку аргумента [[Class]].
function isArray(ar) {
return Array.isArray(ar) ||
(typeof ar === 'object' && objectToString(ar) === '[object Array]');
}
Однако проверка [[Class]] на самом деле является дублирующим усилием, потому что Array.isArray
также проверяет [[Класс]], поэтому тоже в конечном итоге удален – оставляя только вызов Array.isArray
.
Сегодня util.isArray
- это просто псевдоним Array.isArray
.
Таким образом, существование util.isArray
в основном является наследием и может быть безопасно проигнорировано.