如何实现javascript数组?

Cla*_*diu 29 javascript arrays associative-array

即,以下代码如何:

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");
Run Code Online (Sandbox Code Playgroud)

输出'5'作为长度,当你所做的就是设置各种元素?

我对此代码的"问题"是,我不理解如何在length不调用getLength()setLength()方法的情况下进行更改.当我执行以下任何操作时:

a.length
a['length']
a.length = 4
a['length'] = 5
Run Code Online (Sandbox Code Playgroud)

在非数组对象上,它的行为类似于dict/associative数组.当我在数组对象上执行此操作时,它具有特殊含义.JavaScript中的哪种机制允许这种情况发生?javascript是否有某种类型的属性系统进行翻译

a.length
a['length']
Run Code Online (Sandbox Code Playgroud)

进入"获取"方法和

a.length = 4
a['length'] = 5
Run Code Online (Sandbox Code Playgroud)

进入"设置"方法?

tva*_*son 16

JavaScript中的所有内容都是一个对象.在a的情况下Array,该length属性返回数组的索引项的内部存储区域的大小.一些混淆可能会起作用,因为[]运算符适用于数字和字符串参数.对于数组,如果将其与数字索引一起使用,则返回/设置预期的索引项.如果将它与字符串一起使用,它将返回/设置数组对象上的命名属性 - 除非字符串对应于数值,否则它将返回索引项.这是因为在JavaScript中,数组索引通过隐式toString()调用强制转换为字符串.坦率地说,这只是让你头脑发热并且说"JavaScript,这就是为什么他们会嘲笑你"的那些东西.

浏览器之间的实际底层表示可能不同(或者可能不同).除了使用它时提供的接口之外,我不会依赖任何其他东西.

您可以在MDN上找到有关Javascript数组的更多信息.

  • “JavaScript 中的一切都是对象”...除了原语 (2认同)

Sam*_*ain 5

JavaScript 数组的特征

  1. 动态 - JavaScript 中的数组可以动态增长 .push
  2. 可以是稀疏的 - 例如,array[50000] = 2;
  3. 可以是密集的 - 例如,数组 = [1, 2, 3, 4, 5]

在 JavaScript 中,运行时很难知道数组是密集的还是稀疏的。所以它所能做的就是猜测。所有实现都使用启发式方法来确定数组是密集还是稀疏。

例如,上面第 2 点中的代码可以向 JavaScript 运行时指示这可能是稀疏数组实现。如果数组使用初始计数进行初始化,则可能表明这可能是一个密集数组。

当运行时检测到数组是稀疏的时,它的实现方式与对象类似。因此,不是维护连续的数组,而是构建键/值映射。

有关更多参考信息,请参阅JavaScript 数组内部是如何实现的?