在加号(+)运算符和String.concat()
方法给出了相同的结果.
加(+)运算符 ;
str1 + str2;
String concat()方法 ;
str1.concat(str2);
另外,它写在w3schools ;
但是使用JavaScript,方法和属性也可用于原始值,因为JavaScript在执行方法和属性时将原始值视为对象.
那么哪种方式更好地用于组合我们用于基元或JS中的String对象,如果有的话,它们之间的性能优势和劣势是什么?
var firstName = "John" // String var y = new String("John"); // with String Object
以下是给出相同结果的示例代码;
function example1 () {
var str1 = "Hello ";
var str2 = "World!";
document.getElementById("demo1").innerHTML += str1 + str2;
}
function example2 () {
var str1 = "Hello ";
var str2 = "World!";
document.getElementById("demo2").innerHTML += str1.concat(str2);
}
function example3 () {
var str1 = String("Hello ");
var str2 = String("World!");
document.getElementById("demo3").innerHTML += str1 + str2;
}
function example4 () {
var str1 = String("Hello ");
var str2 = String("World!");
document.getElementById("demo4").innerHTML += str1.concat(str2);
}
example1();
example2();
example3();
example4();
Demo 1:
Demo 2:
Demo 3:
Demo 4:
原语上的字符串方法与对象上的字符串方法之间的行为没有区别.
性能有很大差异,因为原始版本在这个jsperf中看起来要快得多(可能快100倍),这可能是由于解释器优化.
从这个jsperf可以看出,性能的主要差异是由var str1 = new String("Hello ");
而不是var str1 = "Hello ";
.该+
运营商与concat()
没有多大区别的.我的猜测是因为JS解释器正在优化字符串方法.但是,创建实际的字符串对象并不是优化或有效的.
至于ECMAScript规范,在ECMAScript规范中+
,它明确指出如果左操作数(lprim)的原始值是一个字符串,则返回串联结果的字符串ToString(lprim) followed by ToString(rprim)
.
在ECMAScript规范中String.prototype.concat()
,它说:Let R be the String value consisting of the characters in the previous value of R followed by the characters of ToString(next).
这个措辞意味着+
当给出左操作数作为字符串时,将右操作数转换为字符串并在.concat()
内部调用,这正是这样.concat()
做的.
显然,如果左操作数不是字符串,那么您将获得不同的行为,+
因为它根本不会将其视为字符串操作.
无论是否有字符串对象或字符串原语,它都可以产生影响的情况是,如果要将自定义属性添加到字符串对象,则需要对象表单,而不是原始表单.
至于何时使用+
以及何时使用.concat()
,这是个人编码风格的选择.两者都达到了相同的效果.我个人更喜欢在可能的情况下使用运算符,因为代码看起来似乎更简单.
除非你有特定的理由来创建一个字符串对象,否则你通常应该使用原语.
所以,真的没有理由这样做:
var str1 = String("Hello "); var str2 = String("World!"); document.getElementById("demo").innerHTML = str1.concat(str2);
什么时候工作得很好:
var str1 = "Hello "; var str2 = "World!"; document.getElementById("demo").innerHTML = str1 + str2;
这是我知道你何时需要/需要一个显式字符串对象的唯一一个例子:
// actual string object will retain custom property
var str1 = new String("Hello");
str1.customProp = "foo";
log(str1.customProp);
// string primitive will not retain custom property
var str2 = "Hello";
str2.customProp = "foo";
log(str2.customProp);
function log(x) {
document.write(x + "
");
}