11

可能重复:
Javascript 中的对象与数组的键/值对

我在 JavaScript 中有一个变量,我像hash一样使用它。我可以像这样初始化它:

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

7 回答 7

20

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

虽然理论上你可以互换使用它们,但看看当你对它们进行 JSON 化时会发生什么:

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

// array:
'[]'

// object:
'{"one":1}'
于 2012-08-23T18:27:41.817 回答
4

Array ( []) 是Object ( ) 的一种{}。主要区别在于:

  • 数组有一个神奇的length属性,它等于最高设置的数字键(加一):

    var a = [];
    a[100] = 0;
    a.length; // is 101
    
    var o = {};
    o[100] = 0;
    o.length; // is undefined
    
  • Array 的toString方法打印出数字键的值:

    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]"
    
  • 数组有很多处理记录的特定函数:

    > 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"]
    
于 2012-08-23T18:31:59.013 回答
2

是的,{}是一个空对象并且[]是一个空数组。请注意,数组一种对象,经过优化以处理值列表,但是,与任何 Javascript 对象一样,它可以接受其他属性,例如"one"or "two"— 这就是它可以支持方法的方式,例如myArray.push(1):push是所有数组的属性。事实上,你甚至可以毫不费力myArray["push"] = someOtherFunction地说重写。push与所有 Javascript 对象一样,数组支持任意键值分配。

不过,归根结底,它与幕后表演有关。如果您正在寻找存储值的顺序列表,该数组将更好地处理它并提供一些有用的属性,如pushshiftlength等。另外,未来的开发人员实际上会知道您在做什么。如果您只想存储键值对,那么对象就是要走的路,因为它不会被所有额外的重量所困扰。

简而言之,虽然它们都支持键值对,但它们在幕后却大不相同。不要太担心它,并使用更适合手头工作的那个。

于 2012-08-23T18:31:00.430 回答
0

using{}是一个对象,它是 Javascript 中每个复杂类型的基础。您可以将数组视为对象的原因是因为在 Javascript 中数组一个对象(但不是相反)。

Javascript 中的方括号是您访问对象属性的方式,很像.C、Java、Python 等中的符号。恰好数组在属性 0、1、2 等处具有值。数组也有一个整体一堆其他内置属性,如length, shift,push等。

这肯定是过于简单化了,但它是理解正在发生的事情的简单方法。

于 2012-08-23T18:31:00.747 回答
0

数组是对象,但对象不是(总是)数组。数组具有并非每个对象都存在的方法和属性示例

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

如果您将数组用作哈希图并尝试将已经存在的东西用作键,您将遇到麻烦

于 2012-08-23T18:36:19.013 回答
0

[]适用于数组,{}适用于普通对象。请注意,数组是具有许多方法和属性的对象,这些方法和属性允许对列表进行建模(例如,push、slice、...)。

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

于 2012-08-23T18:36:48.433 回答
-1

第一个是 a array,第二个是 a literal object

var a = {};
a.SomeProperty = 1;

console.log(a.SomeProperty);

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

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

这将在控制台日志中1输出。2

For hashing, use an array错误),感谢您的评论。

于 2012-08-23T18:28:38.590 回答