我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
当前回答
这是我想出的一个解决方案,并一直用于我的项目。。。
function isArray (o) {
return typeof o === "object" && o.length !== undefined;
}
isArray({}); // false
isArray(1); // false
isArray("str"); // false
isArray(function(){}); // false
isArray([]); // true
唯一的陷阱是,如果您的对象恰好具有长度属性,它将给出一个假阳性:
isArray({length:0}); // true
如果你对这个缺点很满意,并且知道你的纯对象没有这个属性,那么这是一个干净的解决方案,应该比Object.prototype.toString.call方法更快。
其他回答
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']
在您的情况下,您可以使用Array的concat方法,它可以接受单个对象,也可以接受数组(甚至组合):
function myFunc(stringOrArray)
{
var arr = [].concat(stringOrArray);
console.log(arr);
arr.forEach(function(item, i)
{
console.log(i, "=", item);
})
}
myFunc("one string");
myFunc(["one string", "second", "third"]);
concat似乎是Array最古老的方法之一(即使是IE 5.5也很熟悉)。
我知道,人们正在寻找某种原始的JavaScript方法。但如果你想少想一想,看看Undercore.js的isArray:
_.isArray(object)
如果对象是数组,则返回true。
(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true
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();
这是我想出的一个解决方案,并一直用于我的项目。。。
function isArray (o) {
return typeof o === "object" && o.length !== undefined;
}
isArray({}); // false
isArray(1); // false
isArray("str"); // false
isArray(function(){}); // false
isArray([]); // true
唯一的陷阱是,如果您的对象恰好具有长度属性,它将给出一个假阳性:
isArray({length:0}); // true
如果你对这个缺点很满意,并且知道你的纯对象没有这个属性,那么这是一个干净的解决方案,应该比Object.prototype.toString.call方法更快。