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

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


当前回答

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

var myArray=[];

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

其他回答

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

var myArray=[];

if(myArray instanceof Array)
{
....
}
A = [1,2,3]
console.log(A.map == [].map)

为了寻找最短的版本,这是我到目前为止得到的。

注意,没有一个完美的函数能够始终检测所有可能的组合。与其期待一个神奇的工具,不如了解工具的所有能力和局限性。

下面是一段代码片段,它将解释数组的一个重要事实,在学习JavaScript时应该尽早了解这些事实(与我不同)。

//此函数将字符串放入数组中var stringInsideArray=函数(输入){if(输入类型==“string”){返回[输入];}else if(Array.isArray(输入)){返回输入;}其他{throw new Error(“输入不是字符串!”);}}var output=stringInsideArray('hello');console.log('第一步输出:',输出);//[“你好”]//使用typeof方法验证输出是否为对象console.log('第二步输出:',输出类型);//对象//使用Array.isArray()方法验证输出是否为数组console.log('第三步输出:',Array.isArray(输出));//真的

数组实际上是对象。

使用typeof运算符,stringInsideArray('hello')的输出证明[“hello”]确实是一个对象。这让我困惑了很长一段时间,因为我假设数组是JavaScript数据类型。。。

只有七种JavaScript数据类型,数组不是其中之一。

要回答您的问题,请使用Array.isArray()方法确定输出是一个数组。

这是我的懒惰方法:

if (Array.prototype.array_ === undefined) {
  Array.prototype.array_ = true;
}

// ...

var test = [],
    wat = {};

console.log(test.array_ === true); // true
console.log(wat.array_ === true);  // false

我知道“搞乱”原型是一种亵渎,但它的性能明显优于推荐的toString方法。

注意:这种方法的一个缺点是它不能跨iframe边界工作,但对于我的用例来说,这不是问题。

我用两种替代方法以及错误检查更新了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(在我的机器上)中第二好方法的两倍。