为什么 JavaScript 可能会不分配内存?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
substr 这个方法是定义在 String.prototype 上面的,s 作为一个字符串在执行 substr 的时候,已经执行了一次 new String(s)。正常情况下 s2 也应该是保存在内存中,那么【可能】这种时候是否是以对象的形式去保存 s2,也就是指保存[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 范围。