如何检查对象是否为数组?

我正在尝试编写一个接受字符串列表或单个字符串的函数。如果是字符串,那么我想将其转换为仅包含一项的数组。然后,我可以循环浏览它而不必担心错误。

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


我整理了以下各种解决方案,并创建了jsperf 测试 。它们都非常快,因此只需使用Array.isArray -现在得到很好的支持,并且可以跨框架使用

答案

ECMAScript 标准中提供的用于找到 Object 类的方法是使用Object.prototypetoString方法。

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

或者,您可以使用typeof来测试它是否为字符串:

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

或者,如果你不关心性能,你可以只是做一个concat到一个新的空数组。

someVar = [].concat( someVar );

还有一个可以直接查询的构造函数:

if (somevar.constructor.name == "Array") {
    // do something
}

请查看@TJ 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']

我将首先检查您的实现是否支持isArray

if (Array.isArray)
    return Array.isArray(v);

您也可以尝试使用instanceof运算符

v instanceof Array

在现代浏览器中,您可以

Array.isArray(obj)

Chrome 5,Firefox 4.0,IE 9,Opera 10.5 和 Safari 5 支持)

为了向后兼容,您可以添加以下内容

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

如果使用 jQuery,则可以使用jQuery.isArray(obj)$.isArray(obj) 。如果使用下划线,则可以使用_.isArray(obj)

如果您不需要检测在不同框架中创建的数组,则也可以使用instanceof

obj instanceof Array

jQuery 还提供了$.isArray()方法:

var a = ["A", "AA", "AAA"];

if($.isArray(a)) {
  alert("a is an array!");
} else {
  alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

在所有方法(支持所有浏览器)中,这是最快的:

function isArray(obj){
    return !!obj && obj.constructor === Array;
}

假设您在下面有这个数组

var arr = [1,2,3,4,5];

Javascript(新旧浏览器):

function isArray(arr) {
  return arr.constructor.toString().indexOf("Array") > -1;
}

要么

function isArray(arr) {
  return arr instanceof Array;
}

要么

function isArray(arr) {
  return Object.prototype.toString.call(arr) === '[object Array]';
}

然后这样称呼它:

isArray(arr);

Javascript(IE9 +,Ch5 +,FF4 +,Saf5 +,Opera10.5 +)

Array.isArray(arr);

jQuery 的:

$.isArray(arr);

角度:

angular.isArray(arr);

下划线和 Lodash:

_.isArray(arr);

Array.isArray 可以快速运行,但是并非所有版本的浏览器都支持。因此,您可以为其他人设置例外并使用通用方法:

Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }

简单的功能检查一下:

function isArray(object)
{
    if (object.constructor === Array) return true;
    else return false;
}

正如 MDN 在这里所说:

使用Array.isArrayObject.prototype.toString.call区分常规对象和数组

像这样:

  • Object.prototype.toString.call(arr) === '[object Array]' ,或

  • Array.isArray(arr)

这个问题只有一种解决方案

x instanceof Array

其中 x 是变量,如果 x 是数组,它将返回 true,否则返回 false。