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

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


当前回答

这是我想出的一个解决方案,并一直用于我的项目。。。

function isArray (o) {
    return typeof o === "object" && o.length !== undefined;
}

isArray({}); // false
isArray(1); // false
isArray("str"); // false
isArray(function(){}); // false

isArray([]); // true

唯一的陷阱是,如果您的对象恰好具有长度属性,它将给出一个假阳性:

isArray({length:0}); // true

如果你对这个缺点很满意,并且知道你的纯对象没有这个属性,那么这是一个干净的解决方案,应该比Object.prototype.toString.call方法更快。

其他回答

正如MDN在这里所说:

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

这样地:

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

您可以检查变量的类型是否为数组;

var myArray=[];

if(myArray instanceof Array)
{
....
}

我见过的最佳解决方案是用跨浏览器替换typeof。检查Angus Croll的解决方案。

TL;DR版本在下面,但这篇文章对这个问题进行了很好的讨论,所以如果您有时间,应该阅读它。

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};

我会制作一个函数来测试您正在处理的对象的类型。。。

函数whatAmI(me){return Object.pr原型.toString.call(me).split(/\W/)[2];}//测试控制台日志(whatAmI([“瞄准”,“@”]),whatAmI({生活:4,呼吸:4}),whatAmI(函数(ing){return ing+“到全局窗口”}),我(“要和你做什么?”));//输出:数组对象函数字符串

然后你可以写一个简单的if语句。。。

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}

这是我在考虑到以下评论的情况下对这个答案进行改进的尝试:

var isArray = myArray && myArray.constructor === Array;

它消除了if/else,并考虑了数组为空或未定义的可能性