JS 中没有传统意义上的数组,数组其实是哈希表

2020-12-05 19:30:51 +08:00
 vision1900

那么问题来了。用 JS 实现的链表还有意义吗?

既然 JS 中数组本质是哈希表,那么用链表和数组进行插入删除效率对比,感觉应该没优势啊。

各位在 Code Review 时碰上自己动手用 JS 写链表的会怎么 Comment?

6417 次点击
所在节点    JavaScript
45 条回复
libook
2020-12-07 13:28:29 +08:00
用 JS 写链表,就好比是在手枪上装了个高倍狙击镜,并不能达到预期的效果,所以如果团队内有人这样写,我会让他要么改回原生数据结构,要么拿 Rust/C++重写。

JS 跑在引擎上,引擎给 JS 语言提供给的内存空间是抽象的,真实反映在操作系统内存管理上可能是连续的也可能是不连续的。像 JS 的 Array 底层引擎实现可能是多种模式动态切换的。
操作系统给引擎提供的内存也是抽象的,真实反映在物理内存上可能是连续的也可能是不连续的。

在如此高级抽象的语言上考虑算法性能是不可能有定论的,因为可能每次运行的时候情况都会不一样,控制器芯片、操作系统、引擎也都会对一些常见情况做优化,这个是在语言层面无法把控的。要是真的在项目上要考虑性能问题,可以做宏观的压力测试,有问题要解决大多也都是在系统架构上优化,语法算法上的优化余地不多。

用 JS 不看性能,看性能不用 JS 。WebAssembly 以及 Node.js 的 N-API 主要就是用来解决这个问题的。
libook
2020-12-07 13:29:52 +08:00
JS 不只有 Array 一种数组,还有很多,比如 ArrayBuffer,虽然不一定满足你的需求,但是很多特殊场景都可以覆盖到了。
wxsm
2020-12-07 13:31:39 +08:00
> The JavaScript Array class is a global object that is used in the construction of arrays; which are high-level, list-like objects.

MDN 是这么说的,可以这么认为吧。
wxsm
2020-12-07 13:35:39 +08:00
不过,怎么说呢,纠结 JS 的 Array 到底是链表还是哈希表,有什么意义吗? JS 本身是高级语言,具体是怎么实现的完全看 runtime 怎么写,语言也没有提供指针和寻址的能力。换句话说,标准提供了 Array,你用就行了,效率什么的,引擎帮你考虑了,别管那么多。
zjffun
2020-12-12 15:11:25 +08:00
@mxT52CRuqR6o5 @dartabe 刚才又去试了下 Set 确实很快,可能当初别的原因导致很慢一看 ES 规范写了遍历就就误解了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX