JavaScript: detect if argument is array instead of object (Node.JS)

91,495

Solution 1

  • Array.isArray

native V8 function. It's fast, it's always correct. This is part of ES5.

  • arr instanceof Array

Checks whether the object was made with the array constructor.

A method from underscore. Here is a snippet taken from the their source

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

This method takes an object and calls the Object.prototype.toString method on it. This will always return [object Array] for arrays.

In my personal experience I find asking the toString method is the most effective but it's not as short or readable as instanceof Array nor is it as fast as Array.isArray but that's ES5 code and I tend to avoid using it for portability.

I would personally recommend you try using underscore, which is a library with common utility methods in it. It has a lot of useful functions that DRY up your code.

Solution 2

Try this code:

Array.isArray(argument)

Solution 3

How about:

your_object instanceof Array

In V8 in Chrome I get

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

Solution 4

I looks like this question has several good answers, but for completeness I would add another option, which have not been suggested earlier.

In order to check if something is an array, you can use Node.js util native module and its isArray() function.

Example:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

With that method you do not have to worry about JS standards implemented by V8 as it will always show the right answer.

Share:
91,495
700 Software
Author by

700 Software

Join 700.social ! A happy medium between Facebook and Gab. :) The name is too long but the domain looks good. Also, Software Development / Consulting (423) 802-8971 700software.com old username: George Bailey (but now I use my real name) http://www.google.com/images?q=George+Bailey

Updated on June 27, 2020

Comments

  • 700 Software
    700 Software almost 4 years

    How should I detect if the argument is an array because typeof [] returns 'object' and I want to distinguish between arrays and objects.

    It is possible that object will look like {"0":"string","1":"string","length":"2"} but I don't want it to come out as an array if it is in fact an object looking like an array.

    JSON.parse and JSON.stringify are able to make this distinction. How can I do it?

    I am using Node.JS which is based on V8 the same as Chrome.

  • Tom Spencer
    Tom Spencer almost 10 years
    FWIW, util.isArray() currently proxies to Array.isArray(): github.com/joyent/node/blob/…
  • Kof
    Kof over 8 years
    Use node.js util library - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
  • Sunil Khiatani
    Sunil Khiatani over 7 years
    gentle reminder, don't us require('util').isArray(arr) in node v4.00 and above. It's deprecated
  • Alexis Wilke
    Alexis Wilke over 5 years
    Somehow, in Node 10.x it looks like arr instanceof Array fails. However the Array.isArray() works great.
  • Kamafeather
    Kamafeather about 3 years
    It might work, but it is pretty unreadable and absolutely cryptic over what that piece of code is actually doing. I would suggest to stick to something more clear like Array.isArray(variable), for the sanity of who will read the code in few years.