在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;