0

我目前正在研究 JavaScript 对象和数组的性质。我知道在 JavaScript(作为一种面向对象的语言)中,一切都源自 object {}

我将逐步完成我的调查,以帮助理解我在这里提出的问题。每次对对象或数组赋值后,它下面的注释说明了赋值后该变量的状态。

我已经在 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"

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

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

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

4

1 回答 1

0

实际上,相反的情况正在发生。

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

例如:

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

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

于 2013-08-16T15:06:50.337 回答