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

mpen 2581 javascript arrays javascript-objects

我正在尝试编写一个接受字符串列表或单个字符串的函数.如果它是一个字符串,那么我想将它转换为只有一个项目的数组.然后我可以循环它而不用担心错误.

那么我该如何检查变量是否是一个数组?


我已经完成了下面的各种解决方案,并创建了一个jsperf测试.

user113716.. 1920

ECMAScript标准中给出的用于查找Object类的toString方法是使用该方法Object.prototype.

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克罗德的博客,张贴在他的评论如下.

查看此基准测试以了解哪种方法表现更好: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']

  • +1 Yup,`toString`是其中一种方法.我在这里做了一些综述:http://blog.niftysnippets.org/2010/09/say-what.html (64认同)
  • 生活在现代世界 - "Array.isArray(obj)" (19认同)
  • 如果你不想输入"[object Array]",请使用Object.prototype.toString.call(someVar)=== Object.prototype.toString.call([])或者如果你不喜欢的话,可以设置一个方便的函数不想输入Object.prototype.toString.call (16认同)
  • 我使用vanilla Array.isArray,它在'现代浏览器'中工作(即IE9 +和其他所有人).对于旧的浏览器支持,请使用来自MDN的垫片https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray (13认同)
  • `typeof new String('beans')`>'object' (3认同)

ChaosPandion.. 1259

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

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

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

v instanceof Array

  • 如果`v`是在另一个帧中创建的,则`v instanceof Array`将返回false(`v`是`thatFrame.contentWindow.Array`类的实例). (125认同)
  • 具体来说:[`Array.isArray`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray)被定义为ECMAScript 5/Javascript 1.8.5的一部分. (46认同)
  • 非常简单和整洁的解决方案BUT isArray与一些旧版浏览器(ex IE7和IE8)不兼容.资料来源:http://kangax.github.io/es5-compat-table/# (8认同)
  • 怎么样:if(Array.isArray)返回Array.isArray(v); else return v instanceof Array; (2认同)

Fela Winkelm.. 809

在现代浏览器中,您可以做到

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

  • @NobleUplift:如果数组来自不同的帧,则`instanceof Array`失败,因为来自该不同帧的每个数组都有不同的`Array`构造函数和原型.出于兼容性/安全性原因,每个帧都有自己的全局环境,这包括全局对象.一帧中的`Object`全局与另一帧中的`Object`全局不同.对于'Array`全局变量也是如此.[Axel Rauschmayer更多地讨论了这一点](http://2ality.com/2013/01/categorizing-values.html). (12认同)
  • 这是一个[更完整](https://kangax.github.io/compat-table/es5/#Array.isArray)支持`Array.isArray`的浏览器列表 (7认同)
  • 如果数组来自不同的帧,为什么`instanceof Array`会失败? (5认同)

janr.. 295

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>

  • 请注意,jQuery在内部使用toString方法:[GitHub Source](https://github.com/jquery/jquery/blob/cd4e25e991898bf07ce82fe4ab3d60c32b4a5fc9/test/libs/require.js#L45-L47) (27认同)
  • @JacobSquires取决于.我刚刚在这里测试了Chrome上最新的jQuery - `$ .isArray === Array.isArray`返回true. (5认同)
  • @Renan:这是使用jQuery的好处.它通常使用最现代和最好的方法来完成它,并且您不必自己进行所有功能检查以了解要使用的内容. (3认同)

shinobi.. 102

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

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

  • 使用这种方法有什么缺点吗?它似乎比公认的最佳答案更简单有效. (5认同)
  • @shinobi一切都很好.我想它可能是一个安全的习惯宿醉 - 如果你不小心使用=而不是==,它不会编译为不是可分配的变量. (3认同)
  • 你是对的,根据我在问题中包含的测试,这是最快的. (2认同)

Alireza.. 45

想象一下,你有这个数组如下:

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);


CruorVult.. 33

Array.isArray运行速度很快,但并不是所有版本的浏览器都支持它.所以你可以为其他人做一个例外并使用通用方法:

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

  • 你需要从`Object.prototype`获得`.toString()`方法.现在你正在使用`window.toString()`,这是不一样的. (3认同)

小智.. 23

简单的功能来检查这个:

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

  • 我将它减少到一行`return object.constructor === Array` - 但是你确定这只会为数组返回true吗? (14认同)
  • 可以使用所有布尔表达式执行此操作.当我看到`if(x)返回true时,让我疯狂; 否则返回false` :-)即使它是倒退的,你也应该否定表达. (12认同)
  • 如果对象未定义或为null,则会严重失败. (5认同)
  • 这对于getElementsByTagName没有返回true的原因是因为该函数的结果实际上是HTMLCollection而不是数组. (3认同)

ajax333221.. 16

正如MDN 在这里所说:

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

像这样:

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

  • Array.isArray(arr)


小智.. 16

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

x instanceof Array

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


Billy Moon.. 14

我会创建一个函数来测试你正在处理的对象的类型......

function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }

// tests
console.log(
  whatAmI(["aiming","@"]),
  whatAmI({living:4,breathing:4}),
  whatAmI(function(ing){ return ing+" to the global window" }),
  whatAmI("going to do with you?")
);

// output: Array Object Function String

然后你可以写一个简单的if语句......

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}


Ahmet DAL.. 14

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

var myArray=[];

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


George Jempt.. 11

考虑到这些意见,我试图改进这个答案:

var isArray = myArray && myArray.constructor === Array;

它摆脱了if/else,并解释了数组为null或未定义的可能性


小智.. 11

我这样做的方式非常简单.适合我.有什么缺点吗?

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)

  • 被`{isArray:true}`所欺骗 (7认同)

Safareli.. 10

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray

Array.isArray = Array.isArray || function (vArg) {
    return Object.prototype.toString.call(vArg) === "[object Array]";
};


小智.. 10

我用两种替代方法更新了jsperf小提琴以及错误检查.

事实证明,在'Object'和'Array'原型中定义常量值的方法比任何其他方法都快.这是一个有点令人惊讶的结果.

/* Initialisation */
Object.prototype.isArray = function() {
  return false;
};
Array.prototype.isArray = function() {
  return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;

var arr = ["1", "2"];
var noarr = "1";

/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");

如果变量采用未定义的值,则这两种方法不起作用,但如果您确定它们具有值,则它们可以正常工作.关于如果值是数组或单个值而考虑性能,第二种方法看起来像一个有效的快速方法.它比Chrome上的'instanceof'略快,是Internet Explorer,Opera和Safari(在我的机器上)中第二好的方法的两倍.


小智.. 9

我知道,人们正在寻找某种原始的javascript方法.但如果你想减少思考,请看看这里:http://underscorejs.org/#isArray

_.isArray(object) 

如果object是Array,则返回true.

(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true

  • "Unless another tag for a framework/library is also included, a pure JavaScript answer is expected." (7认同)

John Wundes.. 5

我见过的最好的解决方案是替换typeof的跨浏览器.在这里查看Angus Croll的解决方案.

TL; DR版本如下,但文章是对该问题的一个很好的讨论,所以如果你有时间你应该阅读它.

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};


namuol.. 5

这是我的懒惰方法:

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边界,但对于我的用例,这不是问题.

  • 被`wat = {array_:true}`对象欺骗. (2认同)

Salvador Dal.. 5

Stoyan Stefanov的书籍JavaScript Patterns中有一个很好的例子,它假设处理所有可能的问题以及利用ECMAScript 5方法Array.isArray().

所以这里是:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

顺便说一句,如果你使用jQuery,你可以使用它的方法$ .isArray()

  • +1:为什么不只是一个简单的`if(!Array.isArray){...`? (2认同)

yesil.. 5

如果您知道对象没有concat方法,则可以使用以下代码.

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}


sheelpriy.. 5

检查对象是否为数组的最简单,最快捷的方法.

 var arr = [];
  arr.constructor.name ==='Array'  //return true;

要么

arr.constructor ===Array //return true;

或者你可以做一个实用功能:

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

用法:

isArray(arr); //return true


STEEL.. 5

你可以是isArray方法,但我更愿意检查

Object.getPrototypeOf(yourvariable) === Array.prototype


归档时间:

查看次数:

1441729 次

最近记录:

10 月 前