JavaScript中数组和对象的区别是什么?或者说数组与对象哪个更好?

24
如何在 JavaScript 中识别数组和对象,而 typeof 无法派上用场?
 var arr = [], ob = {};

由于JavaScript中的所有内容都是对象,

if(typeof arr == typeof ob)  => returns true

我希望有一个运算符或者...可以告诉我这个变量是一个数组。只有当对象是数组时,我才可以使用数组函数。这是否可能?

5个回答

39
var arr = [], ob = {};

由于 JavaScript 中一切都是对象,即使 Array 是一个对象,但它也是 Array 类的一个实例。

if(typeof arr == typeof ob)  => returns true as Both are **Objects

那么,你如何识别对象呢?

这就是 instanceof 操作符派上用场的地方,要识别是否为数组,你可以添加额外的检查代码:

if(arr instanceof Object && arr instanceof Array) => returns true 
if(ob instanceof Object && ob instanceof Array) => returns false 

1
@alex 哦,我明白了。那么解决方法是什么? - Angelin Nadar
4
请使用 Object.prototype.toString.call() 或新的 isArray() 方法。 - alex

21

您可以使用 Array.isArray() 方法来检查一个变量是否是数组。

var myArray = [1,2,3,4,5];
console.log(Array.isArray(myArray));


6

在众多的简单/复杂比较中,一个区别是:

var arr = []; # arr.length => 0

var obj = {}; # obj.length => undefined

数组(arr)具有“length”属性,可以返回元素数目,而对象(obj)没有此属性,因此返回undefined。


因为您花时间标记评论以提高清晰度,所以我点赞了。而且,您的答案简单明了。 - Brice C.
1
这在大多数情况下都能正常工作。唯一的边缘情况是当您有一个带有“length”键的对象时。let obj = { length: 11 }; // obj.length => 11 - mrblue

5

区分数组和对象有多种方法,其中一些已经在上面提到了,我想在上面的答案中添加一些内容。

第一种方法 使用长度进行区分,Array 上存在 length 属性,但 Object 上不存在。

 var arr = [1,2,3];  arr.length => 3

 var obj = {name: 'name'}; obj.length => undefined

注意:当某人声明对象如下时,该方法将失败,我们只能在确定不会得到具有长度属性的任何对象时使用此方法。
var rectangle = {length: 50, width: 50}; rectangle.length => 50

第二种方法 使用 instanceof 操作符判断是否为数组

var arr = [1,2,3]; arr instanceof Array => true
var obj = {name: 'name'}; ojb instanceof Array => false 

第三种方法 使用Array.isArray,这是最可取的方法,现在大多数浏览器都支持。

注意:Array.isArray优先于instanceof,因为它可以通过iframes工作。

Array.isArray(arr) => true
true
Array.isArray(obj) => false

如果你想支持ie8浏览器,可以使用Object.prototype.toString 我们可以为ie8编写polyfill

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

Object.prototype.toString.call(arr); =>"[object Array]"
Object.prototype.toString.call(obj); =>"[object Object]"

Reference: isArray


0

你可以通过这种方式只了解真正的对象:

if (typeof x === "object" && !(x instanceof Object && x instanceof Array)) console.log(x);

x 是变量。这将只生成没有数组的对象。


感谢您的贡献,但是这个答案并没有提供任何独特的新信息,因为已经有一个被接受的答案了。 - Quack E. Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接