我刚刚注意到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
答案 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.isArray
(source)
在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()
和许多类似的功能。这样,类型检查将看起来彼此相似,而不是每次都使用不同的查找代码。