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

我刚刚注意到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 

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

当它第一次被添加到节点时 ,它不仅仅是调用Array.isArray

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

这是utils中的一个本地函数,实际上直到v0.6.0才被导出 。

在这种forms下, 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这个行为的util.isArray ,并且一致认为这个行为实际上是不好的,因为y不是一个真正的Array

因此,原型检查function很快被移除,并replace为使用Array.isArray和参数[[Class]]的检查

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

但是,检查[[Class]]实际上是重复的工作,因为Array.isArray 也检查 [[Class]] ,所以它最终也被删除 – 只留下对Array.isArray的调用。

今天, util.isArray只是util.isArray的别名 。

换句话说, util.isArray的存在大部分是遗留的事情,可以安全地忽略。

虽然Node.js源代码使用它们, util.isArray Array.isArray内部使用Array.isArray ( 源代码 )

util.js

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

@SomeKittens是对的,但是这是一个星期前。 我修补了node.js核心和文档 。 现在他们都是一样的事情,或将在适当的时间。

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

这是为了一致性的原因。

node.js有util.isFunction()util.isObject()util.isArray()和一些相似的函数。 这样,types检查将看起来都相似,而不是每次使用不同的代码。

Node.js源代码使用它们util.isArray在util.js内部使用Array.isArray

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