我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
当前回答
异国情调的
您想检查参数是否为字符串,所以请尝试
x===x+''
设isStr=x=>x===x+'';console.log(isStr([]));console.log(isStr([“aa”,“bb”]));console.log(isStr(“”));console.log(isStr(“abc”));
其他回答
我用两种替代方法以及错误检查更新了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(在我的机器上)中第二好方法的两倍。
var length = 16; // Number
var lastName = "Johnson"; // String
var cars = ["Saab", "Volvo", "BMW"]; // Array
var x = {firstName:"John", lastName:"Doe"};
Object.prototype.myCheck= function(){
if (this.constructor === Array){
alert('array');
}else if (this.constructor === Object)
{
alert('object');
}else if (this.constructor === Number)
{
alert('number');
}else if (this.constructor === String)
{
alert('string');
}
}
cars.myCheck();
lastName.myCheck();
length.myCheck();
正如MDN在这里所说:
使用Array.isArray或Object.prototype.toString.call进行区分阵列中的常规对象
这样地:
Object.pr原型.toString.call(arr)==“[对象数组]”,或Array.isArray(arr)
此函数将几乎所有内容转换为数组:
function arr(x) {
if(x === null || x === undefined) {
return [];
}
if(Array.isArray(x)) {
return x;
}
if(isString(x) || isNumber(x)) {
return [x];
}
if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
return Array.from(x);
}
return [x];
}
function isString(x) {
return Object.prototype.toString.call(x) === "[object String]"
}
function isNumber(x) {
return Object.prototype.toString.call(x) === "[object Number]"
}
它使用了一些较新的浏览器功能,因此您可能需要对其进行多填充以获得最大支持。
示例:
> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]
N.B.字符串将被转换为具有单个元素的数组,而不是字符数组。如果您希望使用其他方式,请删除isString复选框。
我在这里使用了Array.isArray,因为它是最健壮的,也是最简单的。
我知道,人们正在寻找某种原始的JavaScript方法。但如果你想少想一想,看看Undercore.js的isArray:
_.isArray(object)
如果对象是数组,则返回true。
(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true