var = {}和var = []的区别是什么?

11

可能是重复问题:
JavaScript中用于键/值对的对象与数组之间的区别

我在 JavaScript 中有一个变量,我想要用它作为 哈希表。 我可以这样初始化:

var selected = [];
或者
var selected = {};

它确实完成了完全相同的事情。例如,我是这样使用它的:

selected["one"] = 1;

if (selected["one"] == 1) console.log("one is selected"); 
// result: one is selected

if (selected["two"] != 1) console.log("two is not selected");
// result: two is not selected

selected["one"] = 0;

if (selected["one"] != 1) console.log("one is no longer selected");
// result: one is no longer selected

这两者真的有区别吗?一个是对象,另一个是数组吗?如果是这样,我应该什么时候会遇到问题呢?也就是说,它们在使用中有什么区别,为什么会选择其中之一?


4
好的,我会尽力进行翻译。请问需要翻译哪些内容? - mellamokb
2
这是因为Javascript中的数组也是对象。因此,您可以像普通对象一样将内容分配给数组对象的插槽。 - Cameron
1
不要将类似数组的语法与数组混淆。例如,在Javascript中,selected["one"]等同于selected.one(前者支持任意字符串作为键,后者只支持字母数字)。 - EthanB
即使从技术上讲,这实际上只是数组和对象差异的重复,但对于不了解(或经常忘记){} 是对象,[] 是数组的人来说,这是一个不同的问题。有点像 2 和“two” 不同。 - Gellie Ann
7个回答

20

[] 是一个数组,{} 是一个对象。数组是一种旨在仅分配数字键的对象类型。

虽然理论上可以将它们互换使用,但在将它们转为 JSON 格式时会发生什么,请看以下示例:

var tmp = []; // or: var tmp = {}
tmp.one = 1;
JSON.stringify(tmp);

// array:
'[]'

// object:
'{"one":1}'

4

数组([])是一种对象({})。它们之间的主要区别如下:

  • Arrays have a magic length property that is equal to the highest-set numeric key (plus one):

    var a = [];
    a[100] = 0;
    a.length; // is 101
    
    var o = {};
    o[100] = 0;
    o.length; // is undefined
    
  • An Array's toString method prints out the values of numeric keys:

    var a = [];
    a[0] = 5;
    a[1] = 6;
    a[2] = 7;
    a.toString(); // "[5,6,7]"
    
    var o = {};
    o[0] = 5;
    o[1] = 6;
    o[2] = 7;
    o.toString(); // "[object Object]"
    
  • Arrays have lots of specific functions for processing records:

    > Object.getOwnPropertyNames(Array.prototype)
    ["join", "toLocaleString", "sort", "some", "lastIndexOf", "splice", "map",
     "constructor", "every", "unshift", "shift", "indexOf", "pop", "forEach", "reverse",
     "reduce", "slice", "concat", "filter", "toString", "reduceRight", "push", "length"]
    

2
是的,{} 是一个空对象,[] 是一个空数组。需要注意的是,数组一种对象,它被优化用于处理值列表,但是像任何Javascript对象一样,它可以接受其他属性,比如"one""two"——这就是它如何支持myArray.push(1)这样的方法: push是所有数组的属性。实际上,你甚至可以说myArray["push"] = someOtherFunction来覆盖push而不会有任何问题。数组和所有Javascript对象一样,支持任意键值分配。
然而,这最终与后台性能有关。如果你想存储一个连续的值列表,数组将更好地处理它并提供一些有用的属性,如pushshiftlength等。此外,未来的开发人员将确切知道你在做什么。如果你只想存储键值对,那么对象是更好的选择,因为它没有那么多额外的负担。
简而言之,虽然它们都支持键值对,但在后台它们非常不同。不要太担心,使用适合手头工作的那个即可。

0

数组是一个对象,但一个对象不一定是数组。 数组具有在每个对象中都不存在的方法和属性。 例如

[].length //0
{}.length //undefined
typeof []['slice'] //function
typeof {}['slice'] //undefined

如果您将数组用作哈希映射,并尝试使用已经存在的内容作为键,则会遇到麻烦。


0

使用{}是一个对象,它是Javascript中每个复杂类型的基础。你可以将数组视为对象的原因是在Javascript中,数组就是一个对象(但反过来不成立)。

Javascript中的方括号是访问对象属性的方式,类似于C、Java、Python等语言中的.符号。巧合的是,数组在属性0、1、2等处有值。数组还有许多其他内置属性,如lengthshiftpush等。

这只是一个过于简化的解释,但这是理解情况的一种简单方法。


0

[] 用于数组,{} 用于普通对象。请注意,数组 是一个带有多个 方法 和属性的对象,可以用来模拟列表(例如 push、slice 等)。

正如 MDN 文档中指出的那样,不应该将数组用作关联数组,即不应该将数组用作哈希表。


-1
第一个是一个数组,第二个是一个字面对象
var a = {};
a.SomeProperty = 1;

console.log(a.SomeProperty);

var b = [];
b['SomeProperty'] = 2;

console.log(b['SomeProperty']);

这将在控制台日志中输出12

对于哈希,使用数组错误的做法),感谢评论。


2
对于哈希,使用数组。 - kapa
为什么呢?我实际上很感兴趣你的回答,因为那正是我一直在做的。 - Novak
1
数组最适合用于数字索引存储(var a = []; a[0] = 1;)。如果你想要一个哈希表,那么数组就只能提供一个简单对象(var a = {}; a['prop'] = 1;)的功能 - 甚至可能会出现你意想不到的缺点(像Kolink答案中的JSON表示)。 - kapa

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