在 Javscript 中,浏览器运行时解释器是否总是将字符串和数字视为不可变的?
当然,在可证明是无害的情况下,他们会优化并将其视为可变的。如果没有,为什么不呢?
例如,考虑不起眼的 for 循环。
for (let i = 0; i < 1000000000000; i++) {
console.log(i)
}
由于变量的作用域限定为循环,并且循环中没有代码需要 i 变量的“旧值”,因此浏览器只需将符号指向每次迭代的数量递增是有意义的。否则,新字节的内存流将被 的新值占用,原因无法想象(“有人可能需要这些旧值!”)。我们将在 for 循环(在内存中创建的新值)和垃圾回收器(杀死 的所有旧值)之间进行不必要的争用,循环通常会赢得该值,并且我们将有一个堆栈溢出。iiiiii
哦,这就是发生的事情,不是吗。如果是这样,为什么浏览器在以其他方式优化代码方面如此聪明时,以这种方式愚蠢?
字符串也有类似的情况。请考虑以下事项。
{
let completeWorks = "This string dictates the complete works of William Shakespeare. To be or not to be that is the question whether it is nobler in the mind..."
completeWorks += "The End." // <-- what happens here?
}
该字符串是块范围的,并且可证明只存在于此块中。因此,当浏览器遇到指令时,它肯定会发生变化 。如果没有,为什么不呢?也许他们有一个很好的理由不这样做,我想学习它。completeWorkscompleteWorks += "The End"completeWorks
冉冉说
相关分类