当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中的+运算符和concat()方法有什么区别

如何解决《JavaScript中的+运算符和concat()方法有什么区别》经验,为你挑选了1个好方法。

加号(+)运算符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:



1> jfriend00..:

原语上的字符串方法与对象上的字符串方法之间的行为没有区别.

性能有很大差异,因为原始版本在这个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 + "
"); }
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有