JavaScript 变量创建 所对应的内存值连续吗

2021-06-18 13:11:32 +08:00
 shilianmlxg
比如我
情况 a
let a = 1
let b = 2
这样是连续的嘛
情况 b
let a = 1
let b = {name:'mafeifei'}
情况 c
let a= 1
setTimeout(()=>{var b =2 },0)
1555 次点击
所在节点    JavaScript
7 条回复
JeffGe
2021-06-18 13:17:10 +08:00
这得看具体引擎实现吧,变量在内存中的分布我猜标准里没有规定。
crystom
2021-06-18 13:19:29 +08:00
不能说不连续,但肯定不是 c 语言那样
shilianmlxg
2021-06-18 15:54:45 +08:00
@JeffGe 比如 v8 引擎
shilianmlxg
2021-06-18 15:55:54 +08:00
之前有个帖子
疑惑来自于这里
https://v2ex.com/t/781924
libook
2021-06-18 18:11:30 +08:00
JS 因为抽象程度比较高,本身是一个比较“反机器”的语言,所以经常被人比作走得很慢的“乌龟”。

但 V8 经常被人比作“火箭”,这俩结合起来就是“火箭带着乌龟飞”。

为什么 V8 可以带着 JS 飞起来,甚至性能直逼 Java 这种编译型语言?

主要是因为 V8 搞了大量奇淫技巧,通过各种动态调整来加速 JS 程序的执行。

我举个栗子,很多排序算法都有最坏情况,如果我只写死用一种算法的话,遇到最坏情况性能就很差了,但我完全可以写多种算法,要排序的时候先自动判断一下数据是什么特征,然后再动态选择一种最适合的算法来排序,那么整个程序在任何情况下都有不错的性能。(当然 V8 里排序不是这么做的,V8 里用的是 Timsort 进行排序的,这个也算是一种动态决策的复合排序算法)

JS 里的一个数据结构,在 V8 里可能是会动态改变数据结构和位置的,V8 开发者会分析各种场景,然后分别做出最佳的方案,让 V8 时刻监控程序当前处于什么状态,以随时决定是否要动态调整数据结构、算法,来最大限度提升性能,以及少吃点内存。

所以分析 JS 在 V8 上运行时候的内存情况,可能意义不大,因为这个不是固定的,同时对于复杂程序来说近乎于混沌状态,只能相信 V8 开发者都做好了优化。

另一方面来说,硬件、操作系统、V8 引擎、JS 每一层都有自己的“Memory”调度机制,层与层之间都是有抽象的,如果你关心的操作系统上的内存调度情况,你只能看到 V8 的数据,看不到 JS 的数据。
secondwtq
2021-06-18 20:29:09 +08:00
贴子白看了……
shilianmlxg
2021-06-20 22:03:53 +08:00
@libook 谢谢大佬科普~

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

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

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

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

© 2021 V2EX