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