在声明JavaScript数组时,“{}”和“[]”有什么区别?

74

在声明JavaScript数组时,“{}”和“[]”有什么区别? 通常我会像这样声明:

var a=[];

将数组声明为var a={}的含义是什么?


9
var a = {}; 表示一个包含键值对的对象。var a = []; 表示一个按顺序存储值的数组,每个值都有一个索引号。 - Tushar
5
当你使用“{}”时,你并没有创建一个数组,而是创建了一个“对象”。 - Rayon
1
什么是确切的问题?_object_和_array_之间的区别是什么?你想做什么?添加一些更多的代码。 - Tushar
1
我想知道[]和{}声明之间的区别,我收到了你的答案@Tushar。 - Venkat
3
答案是,[]{} 在声明时表示不同的内容,正如在 dup.. 所描述的。{} 不是一个数组。 - jfriend00
显示剩余2条评论
8个回答

125

似乎没有人解释数组和对象之间的区别。

[]表示声明一个数组。

{}表示声明一个对象。

数组具有对象的所有特性,并额外拥有一些功能(可以将数组视为对象的子类),其中额外的方法和功能添加在Array子类中。实际上,typeof [] === "object" 进一步表明数组是一个对象。

这些额外的功能包括一个神奇的.length属性,用于跟踪数组中条目的数量,以及一整套用于操作数组的方法,例如.push().pop().slice().splice()等等......您可以在此处查看数组方法列表here

对象使您能够将属性名称与值关联在一起,例如:

var x = {};
x.foo = 3;
x["whatever"] = 10;
console.log(x.foo);      // shows 3
console.log(x.whatever); // shows 10

对象属性可以通过x.foo语法或类似数组的语法x["foo"]进行访问。后一种语法的优点是您可以使用变量作为属性名称,如x[myvar]。同时,使用后一种语法,您可以使用在x.foo语法中JavaScript不允许的字符作为属性名。

属性名可以是任何字符串值。


数组是一个对象,因此它具有与对象相同的所有功能,还有一堆额外的功能用于管理有序连续的从0开始到某个长度的编号索引列表。数组通常用于按数字索引访问的有序列表项。由于数组是有序的,因此有许多有用的功能来管理列表的顺序,例如.sort()或向列表中添加或删除内容。


为什么我可以使用[].但不能使用{}. - Suraj Jain
@SurajJain - 我不理解那个上下文。也许你应该自己写一个问题,并解释你试图做什么的整体背景。 - jfriend00
实际上,我们可以使用空数组字面量[]来执行任何可以使用数组执行的操作,例如[].splice等。但是,如果我们使用空对象字面量{},就不能这样做,例如如果我执行{}.hasOwnProperty,它会报错,为什么呢? - Suraj Jain
@SurajJain - 这可能与上下文中的语言语法有关,因为{}也表示一个新块,所以您不能在可能意味着新块或其含义可能不明确的上下文中使用它来表示对象。您可以执行 let val = {value: true}.hasOwnProperty("value"); console.log(val); - jfriend00
是的,可能是这样,它还表示了一个新的代码块。谢谢解释。 - Suraj Jain
你可以使用 ({}).hasOwnProperty() @SurajJain - criver.to

18

当你声明

var a=[];

您正在声明一个空数组。

但是当您进行声明时

var a={};

你正在声明一个对象。

虽然在JavaScript中Array也是一个对象,但它是由数字键配对的值组成的。 它具有对象的所有功能,但添加了一些像Push,Splice,Length等数组特有的方法。

因此,如果您需要使用数字键来存储某些值,请使用Array。 否则,请使用对象。 您可以像这样创建对象:

var a={name:"abc",age:"14"}; 

并且可以访问像


的值
console.log(a.name);

感谢您的回答,@Mytri。 - Venkat
如何创建实例并访问键值对。 - Venkat
一个小的示例代码对我来说非常有用 @Tushar - Venkat
示例对@Mytri很有用 - Venkat
1
@Venkat var arr = ['A', 'B']; console.log(arr[0]) // Avar obj = { name: 'A', surname: 'B'}; console.log(obj.name); // A 或者 console.log(obj['name']) - Tushar

5
var a = [];

它用于简单值数组的括号。 例如:

var name=["a","b","c"]

var a={}

它用于值数组和对象/属性。

例如:

var programmer = { 'name':'special', 'url':'www.google.com'}

3
可以这样理解:
var a= []; //creates a new empty array
var a= {}; //creates a new empty object

你可以理解为 var a = {}; 等同于 var a = new Object(); 注意:
如果你关心集合中元素(相同类型的)的顺序,可以使用数组,否则可以使用对象。在对象中,元素的顺序不被保证。

2
那么数组和对象有什么区别呢? - nnnnnn
1
@nnnnnn:这里可以参考一下:数组和对象有什么区别? - Rahul Tripathi
@RahulTripathi nnnnnn 表示您还应该解释它们之间的区别以及何时应使用数组而不是对象。 - Tushar
1
@nnnnnn,Tushar 那只是噪音,不管怎样,那不是问题,也不应该是。这是一个独立的答案,应该在一个独立的问题中回答。 - Spencer Wieczorek
当需要集合中元素的顺序时,可以使用数组;当元素顺序不重要时,我们可以使用对象。 - Rahul Tripathi
@RahulTripathi - 这不仅仅是在你有顺序或没有顺序的情况下。数组更像是元素的序列,您可能想知道集合中有多少个元素,并且您可能想管理集合中的项目(搜索它们,删除一些,添加一些,移动一些)。有很多时候可以使用数组,当顺序不是使用数组的主要原因甚至当顺序根本不重要时也可以使用数组。 - jfriend00

1
他们是两个不同的东西。 [] 声明一个数组: 给定,由数字索引持有的元素列表。 {} 声明一个新对象: 给定,具有名称和类型+值字段的对象, 有些人喜欢将其视为“关联数组”。 但在它们的表示中并不是数组。
您可以在 这篇文章 中阅读更多内容。

1

JSON语法

对象 = {} | { 成员 }

  • 成员 = 对 | 对, 成员
  • 对 = 字符串 : 值

数组 = [] | [ 元素 ]

  • 元素 = 值 | 值 元素

值 = 字符串|数字|对象|数组|true|false|null


0
在JavaScript中,数组和对象实际上非常相似,尽管它们在外观上可能有所不同。
对于一个数组:
var array = [];
array[0] = "hello";
array[1] = 5498;
array[536] = new Date();

正如您所见,JavaScript中的数组可以是稀疏的(有效索引不必连续),并且它们可以包含任何类型的变量!这非常方便。

但正如我们所知,JavaScript很奇怪,因此这里有一些奇怪的部分:

array["0"] === "hello"; // This is true
array["hi"]; // undefined
array["hi"] = "weird"; // works but does not save any data to array
array["hi"]; // still undefined!

这是因为 JavaScript 中的所有内容都是对象(这也是为什么您可以使用 new Array() 创建数组)。结果,数组中的每个索引都被转换为字符串并存储在对象中,因此数组只是一个不允许任何人使用不是正整数的键存储任何内容的对象。
那么对象是什么?
JavaScript 中的对象就像数组一样,但“索引”可以是任何字符串。
var object = {};
object[0] = "hello"; // OK
object["hi"] = "not weird"; // OK

当使用对象时,甚至可以选择不使用方括号!

console.log(object.hi); // Prints 'not weird'
object.hi = "overwriting 'not weird'";

你甚至可以进一步定义对象,如下所示:

var newObject = {
    a: 2,
};
newObject.a === 2; // true

但在最新的Chrome和Firefox版本中,array["hi"] = "weird"; array["hi"]; //输出为weird - AyushKatiyar

0

[ ] - 当我们声明一个空数组时使用此符号。

{ } - 当我们声明一个空对象时使用此符号。

typeof([ ]) //object

typeof({ }) //object

但如果你运行

[ ].constructor.name  //Array

因此,从这里你可以理解这是一个数组,Array是基类的名称。 JavaScript的Array类是一个全局对象,用于构建高级别、类似列表的对象。


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