gpt4 book ai didi

Javascript数组转链表,理解内存

转载 作者:行者123 更新时间:2023-11-30 05:32:40 24 4
gpt4 key购买 nike

我有以下代码将数组转换为链表:

function arrayToList(array) {
var list = null;
for (var i = array.length - 1; i >= 0; i--)
list = {value: array[i], rest: list};
return list;
}

这个代码是给我的,所以我试图理解它。我得到了它的基本直觉/要点(我使用过链表,已经学习了 Java 中的数据结构类,了解了 C 中指针的基础知识),等等。

但是,有些东西没有点击,我想确保我能看到发生了什么。因此,让我们考虑创建一个变量list,它引用其值被声明为null 的内存空间。假设这个“内存地址”是0001:

0001:[] 列表

那么在循环的第一次迭代之后会发生什么?这是我的解释。 list 现在指的是一 block 新的空间。也就是说,通过在行中重新定义 list:

list = {value: array[i], rest: list};

我们创建了一个占据新空间的"new"对象。所以现在我们可能有:

0001:[]
0002:[array[i]] list.value
0003:[null] list.rest

(我不太确定 list 现在“指向”的确切位置,假设 0002,但从概念上讲,我猜这在 Javascript 中没有实际意义)

这个理解对吗?我习惯于将数据结构视为 la Java,其中像 list 这样的对象在每次创建实例时都已经定义了空间 block 。我使用过 Python,但之前没有用它构建链表。由此我假设像 Javascript 这样的语言是流动的,因为你可以让一个变量为 null,然后让它引用一个散列,然后当你将它设置为另一个散列时,它会创建一个"new"散列,等等。

谢谢!

最佳答案

首先,JavaScript 中没有原生数据结构,它是一个链表,我们有对象,我们有数组(令人困惑的是对象的特例)。

您在此处向我们展示的代码通过使用对象字面量 生成对象


这似乎更多的是关于在 =

的两边使用相同标识符的问题

=RHS 上的变量将指向它在 LHS 上发生变化之前的事物

// say we have
var foo = {};

// Then
foo = {"fizz": foo};

相当于拥有

var foo = {};

var t = foo;
foo = {"fizz": t}; // `foo` becomes a new object in a different memory location
// that points to `t`s target, meaning that `t` is referencable through `foo` and so
// won't be GC'd if the identifier `t` is cleaned up from namespace

根据通常的从左到右执行顺序,您可能会发现这是违反直觉的,但如果您仔细想想 - 在您知道要做什么之前,您无法“设置”设置,所以在 RHS 完成之前,您无法从 LHS

更新标识符

所以如果你循环这个,你可能会得到这样的结构

foo;           // Object @ e.g. 0x30
foo.fizz; // Object @ e.g. 0x20
foo.fizz.fizz; // Object @ e.g. 0x10
foo.fizz.fizz.fizz; // undefined

每个 Object 都有自己的 HashMap ,它指向前一个(当查找 fizz 时),直到用完 Objects,并且没有内存获得 GCd,因为每个内存仍然可以访问。环境如何实际实现这一点在规范中没有指定,因此 Object 的内存位置永远不会移动,不是要求,但它在内存中的位置不是您能够看到或与之交互的东西(这一切都是在幕后完成的)。因此,对于所有环境内用途,您可以将内存位置视为静态。

关于Javascript数组转链表,理解内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25944140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com