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

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


当前回答

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

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

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

其他回答

ECMAScript标准中给出的查找Object类的方法是使用Object.prototype中的toString方法。

if(Object.prototype.toString.call(someVar) === '[object Array]') {
    alert('Array!');
}

或者您可以使用typeof来测试它是否为字符串:

if(typeof someVar === 'string') {
    someVar = [someVar];
}

或者,如果您不关心性能,您可以直接连接到一个新的空数组。

someVar = [].concat(someVar);

还有可以直接查询的构造函数:

if (somevar.constructor.name == "Array") {
    // do something
}

查看T.J.Crowder的博客中的彻底治疗,如他在下面的评论中所述。

查看此基准测试,了解哪种方法性能更好:http://jsben.ch/#/QgYAV

从@Bharath,使用ES6将字符串转换为数组,以回答以下问题:

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object
}

假设:

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']

这是所有方法中速度最快的(所有浏览器都支持):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}

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

函数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
}

首先,您可以检查console.log(对象类型)。

如果输出是对象,则var{data}=对象,即根据对象键销毁对象。

函数可以是这样的:

const abc = (str1, str2=null) => {
    var result = [];
    result.push(str1);
    result.push(str2);
    return result.join("");
}

以下是我使用的:

function isArray(input) {
  if (input instanceof Array || Object.prototype.toString.call(input) === '[object Array]') {
        return true;
  } else return false;
}