In node.js, why is there a util.isArray and an Array.isArray?
arrays, javascript, node.js
Solution
To actually answer why `util.isArray` exists, we need a bit of a history lesson.
When it was first added to node, it did a bit more than call `Array.isArray`.
function isArray (ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
}
This was a local function in utils and actually wasn't exported until v0.6.0.
In this form, `util.isArray` handled a case that `Array.isArray` doesn't:
> 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 about this behavior of `util.isArray`, and consensus was that this behavior is actually bad because `y` is not really an `Array`.
Thus, the prototype-checking functionality was soon removed and replaced with a check that used both `Array.isArray` and a check of the argument's [[Class]].
function isArray(ar) {
return Array.isArray(ar) ||
(typeof ar === 'object' && objectToString(ar) === '[object Array]');
}
However, checking the [[Class]] is actually duplicate effort because `Array.isArray` also checks the [[Class]], so it too was eventually removed – leaving only a call to `Array.isArray`.
Today, `util.isArray` is just an alias of `Array.isArray`.
So in other words, the existence of `util.isArray` is mostly a legacy thing and can be safely ignored.
Problem
I just noticed the API docs for Node.js v0.10.26 provide for `util.isArray`, util.isArray(object)# Returns true if the given "object" is an Array. false otherwise. ``` var util = require('util'); util.isArray([]) // true util.isArray(new Array) // true util.isArray({}) // false ``` But, how is that different ecmascripts normal, Array.isArray? ``` > Array.isArray([]); true > Array.isArray(new Array); true > Array.isArray({}); false ```