为什么 JavaScript 可能会不分配内存?

发布于 2022-09-07 15:25:31 字数 466 浏览 34 评论 0

MDN 的内存管理上的例子提到,JavaScript 可能决定不分配内存,不知道怎么理解:

var s = "azerty";
var s2 = s.substr(0, 3); // s2 是一个新的字符串
// 因为字符串是不变量,
// JavaScript 可能决定不分配内存,
// 只是存储了 [0-3] 的范围。

var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2); 
// 新数组有四个元素,是 a 连接 a2 的结果

意思是不给变量 s2 分配内存吗?只是存储 [0-3] 范围是怎么存储的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

像极了他 2022-09-14 15:25:31

substr 这个方法是定义在 String.prototype 上面的,s 作为一个字符串在执行 substr 的时候,已经执行了一次 new String(s)。正常情况下 s2 也应该是保存在内存中,那么【可能】这种时候是否是以对象的形式去保存 s2,也就是指保存[0-3]的范围?

·深蓝 2022-09-14 15:25:31

查了一些资料,大概了解其中的原理。

var s = "azerty";
var s2 = s.substr(0, 3);

例子中 s 和 s2 都是基本数据类型,是存放在栈内存中的,而栈内存有个特点就是数据共享。

JavaScript 首先会在栈中创建一个变量为 s 引用,然后查找栈中是否有 azerty 这个值,如果没有找到,就将 azerty 存放进来,然后将 s 指向 azerty。

接着创建一个变量为 s2 引用,查找栈中是否有 aze 这个值,因为此时栈中已经存在了 azerty,所以例子才会说“JavaScript 可能决定不分配内存”,s2 只是指向了 azerty 的 [0-3] 的范围,也就是 s 和 s2 共享 azerty。

基于此,JavaScript 会创建一个变量 s2,但不会再分配一个内存存放它的值 aze,而是让 s2 指向栈中现有的 azerty 的 0-3 范围。

JavaScript中内存使用规则--堆和栈

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文