我在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
真的有区别吗?是一个对象,另一个是数组吗?如果是这样,我什么时候应该遇到问题。也就是说,两者在使用中有什么区别,为什么你会选择一种呢?
答案 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对象一样,数组支持任意键值赋值。
但最终,它与幕后表演有关。如果您希望存储一个连续的值列表,那么该数组会更好地处理它并提供一些有用的属性,如push
,shift
,length
等等。开发人员实际上会知道你在做什么。如果您只想存储键值对,那么该对象就是可行的方法,因为它不会因为所有额外的重量而陷入困境。
简而言之,虽然它们都支持键值对,但它们在幕后却非常不同。不要太担心它,并使用哪个更适合手头的工作。
答案 3 :(得分:0)
使用{}
是一个对象,它是Javascript中每个复杂类型的基础。您可以将数组视为对象的原因是因为在Javascript中,数组是对象(但不是相反)。
Javascript中的方括号是访问对象属性的方式,非常类似于C,Java,Python等中的.
表示法。恰好,数组在属性0,1,2处具有值等数组也有一大堆其他内置属性,如length
,shift
,push
等。
这肯定是过于简单化,但这是一种了解正在发生的事情的简单方法。
答案 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']);
这将在控制台日志中输出1
和2
。
For hashing, use an array
(错误),感谢您的评论。