在JavaScript中,为什么这个classic 的二次附加不是O(n²)?

s = "";
for (i = 0; i < 1000000; i++) {
  s = `( ${s} )`
};
console.log(s.length)

在Firefox 124和Chromium 123中都是O(n).

在Python中,正如预期的那样是O(n²):

s = ""
for i in range(50_000):  # increase by 2x, gets 4x slower
  s = f"( {s} )"
print(len(s))

这是什么魔法,浏览器是如何作弊的? ECMAScript规范是否保证了这种行为?

推荐答案

这是什么魔法,浏览器是如何作弊的?

ropes

ECMAScript规范是否保证了这种行为?

不,但每个常见的JavaScript引擎都会实现它,而且新的实现也几乎必须这样做,因为这是+是在主要浏览器中构建字符串的最快也是最简单的方法,因此也是大多数程序的做法.

Javascript相关问答推荐

同步功能在中间停止

想要检测字符串中的所有单词

在NextJS中使用计时器循环逐个打开手风琴项目?

*ngFor和@代表输入decorator 和选角闭合

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

类型自定义lazy Promise. all

使用useEffect,axios和useParams进行react测试

在react JS中映射数组对象的嵌套数据

XSLT处理器未运行

为什么JPG图像不能在VITE中导入以进行react ?

在Odoo中如何以编程方式在POS中添加产品

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

通过跳过某些元素的对象进行映射

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

按特定顺序将4个数组组合在一起,按ID分组

Chart.js Hover线条在鼠标离开时不会消失

我在哪里添加过滤器值到这个函数?

为什么这个最小Angular 的Licial.dev设置不起作用?

正则表达式以确定给定文本是否不只包含邮箱字符串