在javascript中类似于ruby的#{value}(字符串插值)

我厌倦了这样写:

string_needed =“prefix …..”+ topic +“suffix ….”+ name +“testing”;

我想现在有人可能已经做了一些事情;)

对不起:(

我喜欢利用Array.join:

 ["prefix ....", topic, "suffix....", name, "testing"].join("") 

或使用String.concat

 String.concat("a", 2, "c") 

或者你可以编写自己的连接函数:

 var concat = function(/* args */) { /* * Something involving a loop through arguments */ } 

或使用第三方sprintf函数,例如http://www.diveintojavascript.com/projects/javascript-sprintf

你可以考虑使用coffeescript来编写代码(它有像Ruby这样的插值,即#{foo})。

它“编译”到javascript – 所以你最终会得到像你所写的一样的javascript,但是不需要编写/维护+++代码你厌倦了

我意识到要求你考虑另一种语言是否是一个有效答案的边缘,但考虑到coffeescript的工作方式,你的一个标签是Ruby,我希望它会通过。

作为一个Javascript的好奇心,你可以实现一些基本上类似Ruby的插值:

 sub = function(str) { return str.replace(/#\{(.*?)\}/g, function(whole, expr) { return eval(expr) }) } js> y = "world!" world! js> sub("Hello #{y}") Hello world! js> sub("1 + 1 = #{1 + 1}") 1 + 1 = 2 

在除了字符串文字之外的任何东西上使用它都会遇到麻烦 ,反正它可能很慢(虽然我没有测量过)。 我想我会告诉你的。

直接回答:没有javascript不支持字符串插值。

唯一的方法是自己实现它或使用为你做这件事的第三方库。

编辑

正如Marcos在评论中添加了一个关于ECMAScript 6(Harmony)的提议,所以我们可以进行适当的字符串插值:

 var a = 5; var b = 10; console.log(`Fifteen is ${a + b} and\nnot ${2 * a + b}.`); // "Fifteen is 15 and // not 20." 

请在此处查看更多信息。

我刚刚写了这个hacky函数来做到这一点。 用法如下:

 interpolate("#{gimme}, #{shelter}", {gimme:'hello', shelter:'world'}) // returns "hello, world" 

并实施:

 interpolate = function(formatString, data) { var i, len, formatChar, prevFormatChar, prevPrevFormatChar; var prop, startIndex = -1, endIndex = -1, finalString = ''; for (i = 0, len = formatString.length; i