Javascript 在node.js中,为什么有util.isArray和Array.isArray?
我刚刚注意到为Javascript 在node.js中,为什么有util.isArray和Array.isArray?,javascript,arrays,node.js,Javascript,Arrays,Node.js,我刚刚注意到为util.isArray提供的API文档 如果给定的“对象”是数组,则util.isArray(object)#返回true 否则就错了 但是,不同的ECMAScript是如何正常的呢 虽然Node.js源代码同时使用这两种方法,但是util.isArray在内部使用Array.isArray) 在util.js中: function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; 这是
util.isArray
提供的API文档
如果给定的“对象”是数组,则util.isArray(object)#返回true
否则就错了
但是,不同的ECMAScript是如何正常的呢
虽然Node.js源代码同时使用这两种方法,但是
util.isArray
在内部使用Array.isArray
)
在util.js
中:
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;
这是出于一致性的原因 node.js具有
util.isFunction()
、util.isObject()
、util.isArray()
和许多类似的函数。这样,类型检查将看起来彼此相似,而不是每次都使用不同的代码。是正确的,但那是一周前的事了。现在它们都是一样的,或者会在适当的时候出现
> Array.isArray === util.isArray;
true
要真正回答为什么存在util.isArray
,我们需要上一节历史课
当它运行时,它所做的不仅仅是调用Array.isArray
function isArray (ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
这是UTIL中的一个局部函数,实际上直到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
关于util.isArray
的这种行为,大家一致认为这种行为实际上是不好的,因为y
并不是真正的数组
function isArray (ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
因此,原型检查功能是使用Array.isArray
和检查参数的
但是,检查[[Class]]实际上是重复的工作,因为[[code>Array.isArray
检查[[Class]]也是重复的工作,所以最终也是重复的,只剩下对Array.isArray
的调用
function isArray (ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
今天,util.isArray
只是Array.isArray
的一部分
function isArray (ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
因此,换句话说,
util.isArray
的存在主要是一个遗留问题,可以安全地忽略。这是推测性的,也是不正确的Array.isArray
主要用于整个节点核心,尽管也有一些util.isArray
调用分散在整个节点中(为了保持一致性)util.isArray
是,不是因为它在其他核心模块中使用。仅在util.js内部使用isArray
仅在util内部使用isArray
,并且它比自从引入util的isArray
以来的任何版本都旧。如果这行代码是今天编写的,那么它将只调用Array.isArray
.util。目前为止,util已被弃用。对于用户而言,我在哪里可以了解y=Object.create(x)
和x
之间的差异?链接的线程显示成员函数不同。另外,在首次实现添加util.isArray
时,它不会失败,因为util.isArray(y)
对Array.isArray(y)
的调用会失败?对象。create
实例化一个新对象,并将其原型设置为作为第一个参数传递的对象。这是一种实现经典继承或实例化对象而不调用其构造函数的方法。更多信息和…不,isArray
的第一个实现使用了短路或运算符(|
)。因此,如果参数是数组的instanceof,它将返回true。如果不是,它将调用Array.isArray
,如果为true则返回。如果没有,那么它将执行原型检查并返回true或false。哈哈,我认为我的坏消息忽略了这一点太快了。+1
挖掘数组。isArray
实现的额外收益。我希望有更多这样的答案!(令人惊讶的是,我不得不在一个加号附近工作。我希望这样能减少这种法西斯式的比扎罗内容控制)。