【问题标题】:Is an array in JavaScript a pointers array? [duplicate]JavaScript中的数组是指针数组吗? [复制]
【发布时间】:2020-09-04 18:49:45
【问题描述】:

我是 JavaScript 新手,最近发现 JavaScript 中的数组就像 Java 中的列表,它们可以包含不同类型的变量。

我的问题是,在 JavaScript 中,数组是否由指针组成?同一个数组怎么可能有不同的类型,因为我们必须在分配变量之前定义数组大小?

我试图在谷歌上找到一些信息,但我发现的都是关于数组的示例):

【问题讨论】:

  • javascript 中的数组是对象。检查这个developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 是的,数组不是(必然)“数组数据结构”。是的,在固定大小的容器中存储动态大小的数据的唯一方法是将数据分配到其他地方并存储指向该位置的指针。
  • 引擎确实有各种数组的内部表示,所以这个问题很难准确回答。我强烈建议您通读v8.dev,以深入了解引擎背后发生的事情。

标签: javascript arrays


【解决方案1】:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

JavaScript 是一种松散类型的语言,因此需要注意阻止您在 javascript 数组中使用不同的类型。但我会强烈避免在没有静态类型检查(Typescript)的情况下以这种方式构建数据

const test = ['test', {test:'test'}, 1, true]

【讨论】:

    【解决方案2】:

    您不必在分配变量之前定义数组大小。你可以这样:

    let array = [];
    array.push(12);
    array.push("asd");
    array.push({data:5});
    array.forEach(element => {
        console.log(element);
    }); 
    

    另外我认为你不应该考虑使用如此高级语言的指针。更好的方法是查看“原始”和“对象”等变量。这是一个很好的阅读: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

    【讨论】:

      【解决方案3】:

      高级语言,尤其是脚本语言,倾向于使用指针来引用大多数事物,并且它们使指针访问变得透明。 Javascript 也这样做。大多数东西,甚至像数字和字符串这样的原语,都是对象。 javascript 中的对象具有存储东西的属性。这些属性本质上是指针,因为它们是对其他对象的引用。数组以相同的方式实现,实际上是具有数字属性的对象(以及一些标准对象没有的实用方法,例如.length.push().map() 等)。与对象相比,数组不再具有固定大小。因此,javascript 中的所有内容都存储在这些对象“桶”中,这些对象“桶”可以在其属性中存储任何内容(尽管您可以密封对象,如数字和字符串,以免它们意外更改)。

      具有固定数据类型的语言(例如类似 C 的语言)实现具有固定数据结构的事物,并且确切的大小很容易计算和知道。当您声明一个变量时,编译器使用该变量的类型在内存中保留一些空间。 Javascript 为您处理所有这些,并且不假设任何东西都是固定大小的,因为它不能。 javascript 对象的大小可以随时更改。

      在类 C 语言中,当您请求一个数组时,您是在请求一个特定大小的块。编译器需要知道它有多大,以便它可以确定将所有内容放在内存中的哪个位置,并且它可以使用数组中对象的类型来轻松计算它。解释型语言在幕后使用指针来跟踪所有内容的存储位置,因为它们不能假设它总是在同一个地方,就像编译程序一样。 (这有点简化,当然也有一些注意事项)。

      【讨论】:

        猜你喜欢
        • 2011-07-08
        • 2011-11-27
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多