javascript js数组遍历 es6判断数组 - 检查对象是否是数组?



15 Answers

ECMAScript标准中给出的用于查找Object类的方法是使用Object.prototypetoString方法。

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
}

查看@TJ Crowder博客的全面处理 ,如下面的评论中所述。

查看此jsben.ch/#/QgYAV以了解哪种方法表现更好: jsben.ch/#/QgYAVjsben.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']
js判断对象 js判断数组为空 js判断是对象

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

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

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




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>




想象一下,下面有这个数组:

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



简单的功能来检查这个:

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)




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

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
}



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

Array.prototype.isArray = true;

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



Array.isArray

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



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

_.isArray(object) 

如果object是Array,则返回true。

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



这是我的懒惰方法:

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




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

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




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

var ar = ["ff","tt"]
alert(isArray(ar))



这个函数几乎可以将任何东西变成数组:

function arr(x) {
    if(x === null || x === undefined) {
        return [];
    }
    if(Array.isArray(x)) {
        return x;
    }
    if(isString(x) || isNumber(x)) {
        return [x];
    }
    if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
        return Array.from(x);
    }
    return [x];
}

function isString(x) {
    return Object.prototype.toString.call(x) === "[object String]"
}

function isNumber(x) {
    return Object.prototype.toString.call(x) === "[object Number]"
}

它使用了一些较新的浏览器功能,因此您可能希望将其填充以获得最大支持。

例子:

> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]

NB字符串将转换为具有单个元素而不是字符数组的数组。 删除isString检查你是否愿意isString

我在这里使用过Array.isArray ,因为它是最强大也最简单的。




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

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




你可以试试这个:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false





Related