在node.js中,为什么有一个util.isArray和一个Array.isArray?

Eva*_*oll 34 javascript arrays node.js

我刚刚注意到Node.js v0.10.26提供的API文档util.isArray,

util.isArray(object)#如果给定的"object"是一个Array,则返回true.

否则是假的.

var util = require('util');
util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false
Run Code Online (Sandbox Code Playgroud)

但是,那个不同的ecmascripts是如何正常的,Array.isArray

> Array.isArray([]);
true
> Array.isArray(new Array);
true
> Array.isArray({});
false
Run Code Online (Sandbox Code Playgroud)

jos*_*736 57

要真正回答为什么 util.isArray存在,我们需要一些历史课.

当它第一次添加到节点时,它比调用多了一些Array.isArray.

function isArray (ar) {
  return ar instanceof Array
      || Array.isArray(ar)
      || (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

这里有一些关于这种行为的讨论util.isArray,并且一致认为这种行为实际上是不好的,因为y它实际上并不是真的Array.

因此,原型检查功能很快被删除,并替换为使用两者Array.isArray的检查和检查参数的[[Class]].

function isArray(ar) {
  return Array.isArray(ar) ||
         (typeof ar === 'object' && objectToString(ar) === '[object Array]');
}
Run Code Online (Sandbox Code Playgroud)

然而,检查[[类]实际上是重复的努力,因为Array.isArray 还检查[[类],所以它也最终被删除 -只留下一个电话Array.isArray.

今天,util.isArray只是一个别名Array.isArray.

换句话说,存在util.isArray主要是遗留物,可以安全地忽略.


Som*_*ens 6

Node.js源同时使用它们,内部util.isArray使用Array.isArray()

util.js:

function isArray(ar) {
  return Array.isArray(ar);
}
exports.isArray = isArray;
Run Code Online (Sandbox Code Playgroud)