在node.js中,为什么有一个util.isArray和一个Array.isArray
In node.js, why is there a util.isArray and an Array.isArray?
我刚刚注意到 Node 的 API 文档.js v0.10.26 提供了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 才导出。
在这种形式中,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
并不是真正的Array
。
因此,原型检查功能很快被删除,取而代之的是同时使用 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
只是Array.isArray
的别名。
因此,换句话说,util.isArray
的存在主要是一种遗留问题,可以安全地忽略。
虽然 Node.js 源代码同时使用它们,但util.isArray
内部使用Array.isArray
(源)
在util.js
:
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;
@SomeKittens是对的,但那是一周前的事了。我修补了节点.js核心和文档。现在它们都是同一件事,或者会在适当的时候出现。
> Array.isArray === util.isArray;
true
这是出于一致性原因。
node.js具有util.isFunction()
、util.isObject()
、util.isArray()
和许多类似的函数。这样,类型检查看起来都彼此相似,而不是每次都使用不同的外观代码。
- 如何为json对象中的段发送array[]
- Array.length似乎不起作用;console.log则显示其他情况
- 如何迭代Array.prototype函数
- Javascript 新的 Array 和 join() 方法
- Array.lenght = undefined
- Javascript setTimeout for an array
- NodeJS API调用中Array中的Push和Pull元素
- 如何在MongoDB中将String转换为Array
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 您的平台不支持RxJS-Array.observe
- 在Jquery/Javascript中的Array中插入Textbox值
- 通过jQueryAjax一起发布Array和Form数据时出现问题
- Array.every返回false,而不是类型error
- Javascript-通过i=0直接传递array[0]与array[0],array[i]在“;如果“;陈述
- 为什么我不能在 Array.isArray 上成功使用“call”
- 对于使用Object.create()创建的数组,Array.isArray()返回false
- 您可以使用用户定义的对象派生出Array.isArray()吗?
- Angular.isArray(data) returns false for an Array
- 在node.js中,为什么有一个util.isArray和一个Array.isArray
- 使用Array的区别.isArray和instanceof Array