我可以定义我的字符串文字以自动装箱到另一个构造函数吗?不是String

问题描述

我正在比较这两个代码块的性能

第1块

for(var i = 0; i < 20000; i++) {
  let a = "a random string";
  a.split("");
}

第2块

for(var i = 0; i < 20000; i++) {
  let a = new nativeWindow.String("a random string");
  a.split("");
}

根据此页面测试https://jsben.ch/Nzfb1,第一个代码块的速度提高了50%。

但是我仍然需要使用block2,因为我不想让文字字符串自动装箱到window.String构造函数中,我希望它自动装箱到我定义的构造函数中。

有可能实现这一目标吗?

解决方法

致电new String(val)返回 String的实例对象。它不是不是原始值,这就是为什么它会明显变慢的原因。

typeof new String('a random string') // object

在现实生活中,很少有需要做这种事情的情况。通常将String调用时不使用new,以便将值简单地转换为字符串。在这种情况下,String('random string')只会返回您传入的原始值。

typeof String('a random string') // string

尝试将第三个代码块添加到您的测试中:

for(var i = 0; i < 20000; i++) {
  let a = String("a random string"); // no 'new'
  a.split("");
}

您将看到它的性能与第一个块中的简单初始化几乎相同。

UPD : 根据测试,在某些浏览器中,问题的第一个块仍然比上述第一个块执行速度快几倍。发生这种情况的原因可能是String(val)是一个函数调用,这使得浏览器比简单的初始化过程执行更多的操作。 无论如何,这个答案的重点是创建对象要比简单的初始化慢,并且String像构造函数一样使用是很不寻常的。