[javascript] 检查对象是否是数组?



Answers

在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博客的全面治疗 ,发表在他的评论如下。

看看这个jsben.ch/#/QgYAV来得到一个想法哪个方法更好: jsben.ch/#/QgYAV : 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']
Question

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

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

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




Array.isArray

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



这是我的懒惰方法:

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




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

x instanceof Array

其中x是变量,如果x是数组,则返回true;如果不是,则返回false。




A = [1,2,3]
console.log(A.map==[].map)

在寻找最短的版本,这是我迄今为止。

请注意,没有完美的功能会始终检测到所有可能的组合。 知道你的工具的所有能力和局限性比理想的工具更好。




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

_.isArray(object) 

如果object是一个Array,则返回true。

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



最简单快速的方法来检查一个对象是否是一个数组。

 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



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

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
}



正如MDN 在这里所说:

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

喜欢这个:

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

  • Array.isArray(arr)




如果可以传递给该函数的唯一两种值是字符串或字符串数​​组,请将其保持简单并对字符串可能性使用typeof检查:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}



在现代浏览器中你可以做到

Array.isArray(obj)

developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 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



Array.isArray工作得很快,但并不是所有版本的浏览器都支持它。 所以你可以为他人制定一个例外规定,并使用通用的方法:

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



测试输入值是否为数组的简单函数如下:

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

这适用于跨浏览器和旧浏览器。 这是从TJ Crowders的博客文章中提取的




简单的功能来检查这一点:

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



var is_array = function (value) {
   return value &&
     typeof value === 'object' &&
     typeof value.length === 'number' &&
     typeof value.splice === 'function' &&
    !(value.propertyIsEnumerable('length'));
};

这个功能取自“JS good parts”书,对我来说很完美。




Related