理解JavaScript对象,数组和[]运算符

时间:2013-08-16 15:02:41

标签: javascript arrays object operators accessor

我目前正在研究JavaScript对象和数组的本质。我理解在JavaScript(作为面向对象的语言)中,所有东西都来自对象{}

我会一步一步地进行调查,以帮助理解我的问题。 在对对象或数组进行每次赋值之后,其下面的注释说明了赋值后该变量的状态。

我已经在Chrome控制台中对所有内容进行了测试。

// These will be used throughout the example.
var obj = {};
var arr = [];

好的,我可以用键/值对分配对象。

obj["a"] = "Hello World";
obj["b"] = "Goodbye World";
// {a: "Hello World", b: "Goodbye World"}

在这方面,我也可以传递数字作为关键(虽然我不确定这是不错的做法)

obj[1] = "Another World";
// {a: "Hello World", b: "Goodbye World", 1: "Another World"}

在同样的方面,如果我想从对象中取回一个值,我可以使用[]运算符。

obj["a"];
// "Hello World"
obj[1];
// "Another World"

现在让我们看一下数组对象。我仍然可以使用[]运算符,但这似乎有一个相当奇怪的实现!

arr[0] = "John";
arr[1] = "Pam";
// ["John", "Pam"]

和对象一样,我可以使用[]运算符来获取值。

arr[0];
//"John"

但这似乎有点奇怪...鉴于我的阵列的当前状态,我也可以做以下。

arr["0"] = "Mark";
arr["1"] = "Helen";
// ["Mark", "Helen"]

所以看来,如果我将一个数字作为字符串传入,JavaScript会将它转换为我的数组索引......但是当我传入一个非数字键时会发生什么?

arr["foo"] = "Samantha";
arr["bar"] = "Matthew";
// ["Mark", "Helen"]

因此,当我向数组添加一个键/值对时,它对数组本身没有影响,但我仍然可以从该键中获取值。

arr["foo"]
// "Samantha"

所以我的问题是:为什么,数组如何确定如何存储数据,作为键值对,还是作为数组本身的一部分?

我的直觉是因为数组在技术上是对象的衍生物,它继承了对象将值存储为键/值对的能力,但也允许通过索引存储值(数组的性质)。 / p>

如果有人对此有任何见解,我会很高兴听到它!

1 个答案:

答案 0 :(得分:0)

实际上,正好相反。

Javascript对象中的键始终是字符串

例如:

var obj = {};
obj[42] = "Hi!";
obj["42"];  // "Hi!"

数组的唯一区别是数组具有基于已设置的最高数字索引的特殊length属性。