我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
当前回答
我会制作一个函数来测试您正在处理的对象的类型。。。
函数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
}
其他回答
您可以使用Array.isArray()。这里是一个polyfill:
if (Array.isArray == null) {
Array.isArray = (arr) => Object.prototype.toString.call(arr) === "[object Array]"
}
您可以通过如下推送找到:
函数isArray(obj){return(obj.push类型==“函数”)?真:假;}var array=new array();或var数组=[‘a’,‘b’,‘c’];console.log(isArray(数组));
我用两种替代方法以及错误检查更新了jsperf fiddle。
事实证明,在“Object”和“Array”原型中定义常量值的方法比任何其他方法都快。这是一个有点令人惊讶的结果。
/*初始化*/Object.prototype.isArray=函数(){return false;};Array.prototype.isArray=函数(){返回true;};Object.protype.isArray=false;Array.prototype.isArray=true;var arr=[“1”,“2”];var noarr=“1”;/*方法1(功能)*/if(arr.isArray())document.write(“arr是根据函数<br/>的数组”);if(!noarr.isArray())document.write(“noarr不是根据函数<br/>的数组”);/*方法2(值)-***最快******/if(arr.isArray)document.write(“arr是根据成员值的数组<br/>”);if(!noarr.isArray)document.write(“noarr不是根据成员值的数组<br/>”);
如果变量采用未定义的值,则这两种方法不起作用,但如果您确定它们具有值,则它们会起作用。关于检查性能,如果一个值是数组还是单个值,第二个方法看起来像是一个有效的快速方法。它比Chrome上的“instanceof”稍快,是Internet Explorer、Opera和Safari(在我的机器上)中第二好方法的两倍。
以下是我使用的:
function isArray(input) {
if (input instanceof Array || Object.prototype.toString.call(input) === '[object Array]') {
return true;
} else return false;
}
您可以使用isArray方法,但我更愿意检查:
Object.getPrototypeOf(yourvariable)==Array.prototype