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

In node.js, why is there a util.isArray and an Array.isArray?

本文关键字:isArray Array 一个 util js node 有一个 为什么      更新时间:2023-09-26

我刚刚注意到 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()和许多类似的函数。这样,类型检查看起来都彼此相似,而不是每次都使用不同的外观代码。