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

时间:2014-04-01 23:27:54

标签: javascript arrays node.js

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

  

util.isArray(object)#如果给定的"对象"则返回true。是一个数组。

     

否则为假。

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

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

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

4 个答案:

答案 0 :(得分:57)

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

当它为first added to node时,它会比调用Array.isArray更多。

function isArray (ar) {
  return ar instanceof Array
      || Array.isArray(ar)
      || (ar && ar !== Object.prototype && isArray(ar.__proto__));
}

这是utils中的一个本地函数,实际上并不是exported直到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

There's some discussion here关于util.isArray的这种行为,并且一致认为这种行为实际上很糟糕,因为y实际上不是Array

因此,原型检查功能是soon removed and replaced,其中包含使用Array.isArray和检查参数[[Class]]的检查。

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

但是,检查 [[Class]] 实际上是重复工作,因为Array.isArray also checks [[Class]] ,所以它最终也是removed - 只留下Array.isArray的电话。

今天,util.isArray只是Array.isArray的{​​{3}}。

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

答案 1 :(得分:6)

虽然Node.js源同时使用它们,但util.isArray在内部使用Array.isArraysource

util.js

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

答案 2 :(得分:2)

@SomeKittens是对的,但那是一周前的事。 I patched node.js core and the docs。现在他们都是同一件事,或将在适当的时候。

> Array.isArray === util.isArray;
true

答案 3 :(得分:0)

出于一致性原因。

node.js有util.isFunction()util.isObject()util.isArray()和许多类似的功能。这样,类型检查将看起来彼此相似,而不是每次都使用不同的查找代码。