【问题标题】:What is the purpose of String.concat() in Javascript?Javascript 中 String.concat() 的目的是什么?
【发布时间】:2012-04-20 17:51:31
【问题描述】:

我知道你可以在 Javascript 中连接这样的字符串:

str1 + str2;

或者像这样:

[str1, str2].join('');

为什么还有一个函数可以做到这一点?

str1.concat(str2)

是不是更快了?对我来说,这似乎更像是打字。我的猜测是,这是在优化 str1 + str2 之前使用的。对吗?

【问题讨论】:

  • 您可以将其作为参数传递给函数,而 + 无法做到这一点 :-)
  • @Cameron:这是不正确的。 jsfiddle.net/HeyJavascript/KauJS
  • 您正在传递一个字符串。我的意思是,您不能传递 + 运算符,但函数是一流的对象。
  • 哦,我明白你的意思了。正确的。凉爽的。 =)

标签: javascript string concatenation


【解决方案1】:

是不是更快了?

相反,它似乎要慢得多。

http://jsperf.com/concat-operator-vs-concat

【讨论】:

    【解决方案2】:

    String.prototype.concat 方法非常通用(ECMA Standard 5.1 Edition / June 2011,pp.143-144):

    1. 调用 CheckObjectCoercible 并传递 this 值作为其参数。
    2. S 成为调用 ToString 的结果,并将 this 值作为其参数。
    3. args 是一个内部列表,它是传递给此函数的参数列表的副本。
    4. RS
    5. 重复,而args不为空

      一个。从 args 中删除第一个元素,并让 next 成为该元素的值。

      b.令 R 为由前一个 R 值中的字符组成的字符串值,后跟 ToString(next) 的字符。

    6. 返回R

    因为它非常通用,它几乎可以用于所有具有ToString() 方法的对象。另请参阅以下说明:

    注意: concat 函数是故意通用的;它不要求它的 this 值是一个 String 对象。因此,它可以转移到其他类型的对象中用作方法。

    所以你可以使用String.prototype.concat.call(myObject,....);。请注意,还有一个 Array.prototype.concat 方法,它也非常通用(第 125 页)。

    【讨论】:

    • +1 以获得非常丰富的答案。这实际上解决了为什么有一个 String.concat() 方法,而不是它会更快还是更慢。
    • 它应该更慢,因为它总是调用ToString() 并复制参数列表,而+ 只连接字符串而不会产生这种开销。
    • + 也可以应用于对象,并且完全相同(toString 和连接)。
    • 虽然这是真的,+ 将连接字符串,但没有说明这是如何完成的。加法运算符仅定义为“返回作为连接 ToString(lprim) 后跟 ToString(rprim) 的结果的字符串”。 如何字符串连接是一个实现细节。
    • 重点是,“连接”对象的能力并不是String.concat 存在的原因。我猜真正的意图是让 JavaScript 看起来更像 Java(同时具有 str+strstr.concat)。
    【解决方案3】:

    似乎存在显着的性能差异,尤其是对于 IE:

    http://www.sitepen.com/blog/2008/05/09/string-performance-an-analysis/

    【讨论】:

    • 好点,好点...这篇文章讨论了字符串上的操作符是如何基本优化的,因为它们将在所有浏览器中得到优化,我敢肯定,自从那么。
    【解决方案4】:

    它不会比运算符重载更快或更慢。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 2018-02-19
      • 2010-10-25
      • 1970-01-01
      • 2015-04-08
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多