我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
我正在尝试编写一个函数,它要么接受字符串列表,要么接受单个字符串。如果它是一个字符串,那么我想把它转换成一个只有一个项的数组,这样我就可以在上面循环,而不用担心出错。
那么如何检查变量是否为数组?
当前回答
这是我的懒惰方法:
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边界工作,但对于我的用例来说,这不是问题。
其他回答
检查对象是否为数组的最简单快捷的方法。
var arr = [];
arr.constructor.name === 'Array' // Returns true;
or
arr.constructor === Array // Returns true;
或者您可以创建一个实用函数:
const isArray = (obj) => !!obj && obj.constructor === Array;
用法:
isArray(arr); // Returns true
这是我在考虑到以下评论的情况下对这个答案进行改进的尝试:
var isArray = myArray && myArray.constructor === Array;
它消除了if/else,并考虑了数组为空或未定义的可能性
如果您知道对象没有concat方法,可以使用以下方法。
var arr=[];if(arr.concat类型==“函数”){console.log(“这是一个数组”);}
A = [1,2,3]
console.log(A.map == [].map)
为了寻找最短的版本,这是我到目前为止得到的。
注意,没有一个完美的函数能够始终检测所有可能的组合。与其期待一个神奇的工具,不如了解工具的所有能力和局限性。
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();