var = {}和var = []之间的区别?

时间:2012-08-23 18:24:56

标签: javascript

  

可能重复:
  Objects vs arrays in Javascript for key/value pairs

我在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

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

7 个答案:

答案 0 :(得分:17)

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

虽然理论上你可以互换地使用它们,看看当你JSON-ify时会发生什么:

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

// array:
'[]'

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

答案 1 :(得分:4)

数组([])是对象({})。关键的区别是:

  • 数组的魔法length属性等于最高设置的数字键(加1):

    var a = [];
    a[100] = 0;
    a.length; // is 101
    
    var o = {};
    o[100] = 0;
    o.length; // is undefined
    
  • 数组的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"]
    

答案 2 :(得分:2)

是的,{}是一个空对象,[]是一个空数组。请注意,数组一种对象,经过优化处理值列表,但与任何Javascript对象一样,它可以接受其他属性,如"one""two" - 它是如何支持myArray.push(1)之类的方法的:push是所有数组的属性。事实上,您甚至可以毫不费力地myArray["push"] = someOtherFunction覆盖push。与所有Javascript对象一样,数组支持任意键值赋值。

但最终,它与幕后表演有关。如果您希望存储一个连续的值列表,那么该数组会更好地处理它并提供一些有用的属性,如pushshiftlength等等。开发人员实际上会知道你在做什么。如果您只想存储键值对,那么该对象就是可行的方法,因为它不会因为所有额外的重量而陷入困境。

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

答案 3 :(得分:0)

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

Javascript中的方括号是访问对象属性的方式,非常类似于C,Java,Python等中的.表示法。恰好,数组在属性0,1,2处具有值等数组也有一大堆其他内置属性,如lengthshiftpush等。

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

答案 4 :(得分:0)

Array是一个Object,但Object不是(总是)一个Array。 Array具有不存在于每个对象中的方法和属性 实施例

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

如果你使用一个数组作为一个hashmap并尝试使用已经存在的键,那么你将遇到麻烦

答案 5 :(得分:0)

[]用于数组,{}用于普通对象。请注意,array是一个具有methods个数量的对象,以及允许对列表进行建模的属性(例如push,slice,...)。

正如MDN文档中指出的那样,you shouldn't use an array as an associative array,即数组不能用作哈希表。

答案 6 :(得分:-1)

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

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

console.log(a.SomeProperty);

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

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

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

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