在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