与在 Javascript 中显式创建 String 对象相比,临时内存分配的速度如何?

How is temporary memory allocation is fast when compared to the explicitly creating String objects in Javascript?

提问人:Satvinder pal singh 提问时间:7/2/2023 最后编辑:marc_sSatvinder pal singh 更新时间:7/9/2023 访问量:27

问:

通常建议最好创建字符串基元,而不是创建字符串对象,因为 String 基元只需要内存来存储原始字符串值本身。

但是在内部发生的情况是,当对字符串原语调用方法时,JavaScript 会创建一个临时字符串对象来执行方法操作。

那么这个过程不是更昂贵吗?

JavaScript 字符串 性能 对象 内存

评论

0赞 devsam247 7/2/2023
你能展示一个代码示例吗?
0赞 Alexander Nenashev 7/2/2023
@devsam247检查我的答案
0赞 CherryDT 7/2/2023
比任何微小的性能差异更重要的是,在其对象包装形式中使用内置类型是一种不好的做法,并会导致令人惊讶的行为,因为例如,任何字符串方法都返回字符串而不是对象。new String('a') != new String('a')String

答:

0赞 Alexander Nenashev 7/2/2023 #1

String() 构造函数有开销,否则在创建字符串后,它们在速度方面似乎是一样的。

所以你的问题:

那么这个过程不是更昂贵吗?

似乎恰恰相反......

还有一个更通用的答案 - 你在 JS 中编写的代码不是 JS 引擎在内部执行的内容......将其视为一个黑匣子,您只能对其进行基准测试。但请记住,当 JS 引擎的新版本发布时,您应该更新您的基准测试。

enter image description here

<script benchmark data-count="500000000">

  // @benchmark string literal

  const str = 'one two';
  // @run
  str.indexOf('two');

  // @benchmark String 

  const str2 = String('one two');
  // @run
  str2.indexOf('two');

  // @benchmark string literal initiation
 'one two'.indexOf('two');

  // @benchmark String constructor
  String('one two').indexOf('two');



</script>

<script src="https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>