Подтвердить что ты не робот

В node.js, почему есть util.isArray и Array.isArray?

Я только что заметил документы API для Node.js v0.10.26 для util.isArray,

util.isArray(object) # Возвращает true, если данный "объект" является массивом.

false в противном случае.

var util = require('util');
util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false

Но, как нормальные обычные символы, Array.isArray?

> Array.isArray([]);
true
> Array.isArray(new Array);
true
> Array.isArray({});
false
4b9b3361

Ответ 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 в основном является наследием и может быть безопасно проигнорировано.

Ответ 2

В то время как источник Node.js использует их оба, util.isArray использует Array.isArray внутренне (источник)

В util.js:

function isArray(ar) {
  return Array.isArray(ar);
}
exports.isArray = isArray;

Ответ 4

Это для целей согласованности.

node.js имеет util.isFunction(), util.isObject(), util.isArray() и ряд аналогичных функций. Таким образом, проверки типов будут похожи друг на друга, вместо того, чтобы использовать каждый раз другой код.

Ответ 5

Node.js источник использует их как util.isArray использует Array.isArray внутри внутри util.js

//Function for this
function isArray(ar) {
    return Array.isArray(ar);
}
exports.isArray = isArray;