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

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

如果给定的“对象”是数组,则util.isArray(object)#返回true

否则就错了

var util=require(’util’);
util.isArray([]))
//真的
util.isArray(新数组)
//真的
util.isArray({})
//假的

但是,不同的ECMAScript如何正常,Array.isArray

>Array.isArray([]);
符合事实的
&燃气轮机;Array.isArray(新数组);
符合事实的
&燃气轮机;Array.isArray({});
错误的

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

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

函数isArray(ar){
返回数组的ar实例
||Array.isArray(ar)
||(ar&&ar!==Object.prototype&isArray(ar.\uuuu proto\uuuu));
}

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

在此表单中,util.isArray处理了Array.isArray不:

>x=[1,2,3]
[ 1, 2, 3 ]
&燃气轮机;y=对象。创建(x)
[ ,  ]
&燃气轮机;数组。isArray(y)
错误的
&燃气轮机;Array.isArray(Object.getPrototypeOf(y))
符合事实的

这里对util.isArray的这种行为进行了一些讨论,一致认为这种行为实际上是不好的,因为y不是真正的数组

因此,原型检查功能很快就被删除,取而代之的是使用Array.isArray和参数[[Class]]]的检查

函数isArray(ar){
返回数组.isArray(ar)||
(ar的类型=='object'和objectToString(ar)=='[object Array]');
}

但是,检查[[Class]]实际上是重复的工作,因为数组.isArray也检查[[Class]]],因此它最终也被删除了–只保留对Array.isArray的调用

如今,util.isArray只是Array.isArray的别名

因此,换句话说,util.isArray的存在主要是遗留问题,可以安全地忽略

发表评论