我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
当前回答
你可以试试这个:
var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();
arr.constructor.prototype.hasOwnProperty('push') //true
obj.constructor.prototype.hasOwnProperty('push') // false
其他回答
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']
我见过的最佳解决方案是用跨浏览器替换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 */};
检查此项的简单函数:
function isArray(object)
{
return object.constructor === Array;
}
您可以使用isArray方法,但我更愿意检查:
Object.getPrototypeOf(yourvariable)==Array.prototype
Array.isArray工作速度很快,但并非所有版本的浏览器都支持它。
因此,您可以为其他人创建例外,并使用通用方法:
Utils = {};
Utils.isArray = ('isArray' in Array) ?
Array.isArray :
function (value) {
return Object.prototype.toString.call(value) === '[object Array]';
}