我可以将我的字符串文字定义为自动装箱到另一个构造函数吗?不是字符串()
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
像构造函数一样使用是很不寻常的。
我正在比较这两个代码块之间的性能:
块 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
像构造函数一样使用是很不寻常的。