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

Can I define my string literal to autobox to another constructor? not 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) returns String 的实例对象。它不是原始值,这就是为什么它会明显变慢的原因。

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

在现实生活中,需要做这样的事情的情况非常少。通常 String 在没有 new 的情况下被调用,以便简单地将值转换为字符串。在这种情况下,String('random string') 将只是 return 您传入的原始值。

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 像构造函数一样使用是很不寻常的。