我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。

那么如何检查变量是否为数组?


当前回答

测试输入值是否为数组的简单函数如下:

function isArray(value)
{
  return Object.prototype.toString.call(value) === '[object Array]';
}

这可以跨浏览器使用,也可以使用较旧的浏览器。本文摘自T.J.Crowders的博客文章

其他回答

最好的做法是使用构造函数进行比较,如下所示

if(some_variable.constructor === Array){
  // do something
}

您也可以使用其他方法,如typeOf,将其转换为字符串,然后进行比较,但将其与dataType进行比较总是更好的方法。

正如MDN在这里所说:

使用Array.isArray或Object.prototype.toString.call进行区分阵列中的常规对象

这样地:

Object.pr原型.toString.call(arr)==“[对象数组]”,或Array.isArray(arr)

Use:

var is_array = function (value) {
   return value &&
     typeof value === 'object' &&
     typeof value.length === 'number' &&
     typeof value.splice === 'function' &&
    !(value.propertyIsEnumerable('length'));
};

这个函数取自《JavaScript:TheGoodParts》一书,非常适合我。

检查其原型和Array.isArray之间存在差异:

function isArray(obj){
    return Object.getPrototypeOf(obj) === Array.prototype
}

此函数将直接检查obj是否为数组。

但对于此代理对象:

var arr = [1,2,3]

var proxy = new Proxy(arr,{})

console.log(Array.isArray(proxy)) // true

Array.isArray将其作为Array。

我做这件事的方式很简单。这对我有用。

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)