JavaScript 中 {} 和 [] 的区别

9
我正在学习 JavaScript,遇到了以下问题:
如果我执行以下代码:
let object = {};
object.length

它会抱怨对象长度未定义,但是

let object = [];
object.length 

作品
有人知道为什么吗?
谢谢

2
只有数组有长度属性......但你可以使用 Object.keys(object).length - Simon H
4个回答

10
在JavaScript中,几乎所有的东西都是对象(当然也有例外,最明显的是null和undefined),这意味着几乎所有的值都有属性和方法。
var str = 'Some String';
str.length // 11

{} 是创建空对象的简写。你可以将其视为其他对象类型的基础。Object 提供了原型链中的最后一个链接,可被所有其他对象使用,例如 Array

[] 是创建空数组的简写。虽然它也是类似于对象的数据结构(事实上,如前所述,Object 在其原型链中),但它是一种存储值序列的特殊对象形式。

typeof [] // "object"

当创建一个数组时,它会自动添加一个特殊的属性来反映存储的元素数量: length。这个值会被某些方法自动更新,同时也被其他方法使用。
var arr = [];
arr.hasOwnProperty('length'); // true
arr.length; // 0

事实上,数组的属性并没有什么特别之处(尽管几乎没有什么好的理由使用它们),除了引擎将其用于这些方法。
var arr = [];
arr.foo = 'hello';
arr // []
arr.foo // "hello"
arr.length // 0

这不适用于一个Object。它没有像序列值一样期望一个length属性。因此,当您尝试访问length时,返回的值是undefined,这与任何未知属性相同。
var obj = {};
obj.hasOwnProperty('length'); // false
obj.length; // undefined
obj.foo; // undefined

基本上,数组是一种特殊的数据结构,它期望一系列的数据。因此,会自动添加一个表示数据结构长度的属性。

BONUS:您可以使用length来修剪数组:

var a = [1,2,3,4,5];
a.length; // 5
a.length = 2;
a; // [1, 2]
a.length; // 2

2
这是因为[]是一个数组对象,长度为0,因为没有元素。 {}是一个对象,没有属性length。 数组对象确实有一个名为length的属性,这就是为什么调用[].length时会看到元素的数量。

那么我如何在运行时获取对象的长度?此外,我通过使用数组[]解决了我的问题,但我仍然想知道为什么对象{}对我无效。除了将{}更改为[]之外,一切都保持不变。 - Telenoobies
根据Simon H所述,@Telenoobies,Object.keys(object).length - Jacob
@jbman223,这并不是非常可靠的,因为原型链上的属性不会被Object.keys()枚举。 - Dan
@Telenoobies 同时,理解数组和对象之间的区别非常重要。对象本质上没有长度,因为它们不是按数字索引的。 - Overcode

2

[]在JavaScript中表示数组,因此它具有长度。而{}则是声明一个对象。


2
java !== javascript. - fuyushimoya

1
它们是两个不同的东西。一个是对象,另一个是数组。 {} 是一个对象,它有键和值。 你不能确定对象的长度,因为它的键值对可能不是数字或以任何方式进行索引。 [] 是一个数组,它有编号的索引。它很简单,有一个长度。

1
从技术上讲,数组对象,正如规范中定义的那样,它们是“异类”对象(这也是为什么数组是按引用传递而不是按值传递的原因)。 - Dan
没错,但是JavaScript不能使用.length方法在运行时返回对象的大小? - Telenoobies
“length”是数组固有的一个属性。对象没有“length”概念,因为它不是容器,也没有“length”属性,所以回答是否定的。 - Dan
你说得对,虽然数组作为对象的整个概念更加广泛,我认为有很多在线资源可以帮助你理解它们之间的区别。我只是试图给出一个基本的差异概述,因为我假设OP刚开始学习。 - Overcode
@Telenoobies编辑了我的答案,解释了为什么对象没有长度。 - Overcode

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