我厌倦了写这个的:任何Ruby的#{}值(字符串插值)
string_needed = “前缀.....” +主题+ “后缀......” +名称+“测试”;
,我会觉得自己好像到现在已经做了一些关于这一点;)
我厌倦了写这个的:任何Ruby的#{}值(字符串插值)
string_needed = “前缀.....” +主题+ “后缀......” +名称+“测试”;
,我会觉得自己好像到现在已经做了一些关于这一点;)
对不起:(
我想借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的好奇心,你可以实现的东西,基本上没有红宝石般的插值:
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不支持字符串插值。
唯一的方法是自己实现它或使用第三方库为你做。
编辑
马科斯在评论中添加了孤单的ECMAScript 6(和谐)的建议,所以我们可以有适当的字符串插值:
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and\nnot ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."
请查看更多信息here。
我刚刚写了这个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<len; ++i) {
formatChar = formatString[i];
prevFormatChar = i===0 ? '\0' : formatString[i-1],
prevPrevFormatChar = i<2 ? '\0' : formatString[i-2];
if (formatChar === '{' && prevFormatChar === '#' && prevPrevFormatChar !== '\\') {
startIndex = i;
} else if (formatChar === '}' && prevFormatChar !== '\\' && startIndex !== -1) {
endIndex = i;
finalString += data[formatString.substring(startIndex+1, endIndex)];
startIndex = -1;
endIndex = -1;
} else if (startIndex === -1 && startIndex === -1){
if ((formatChar !== '\\' && formatChar !== '#') || ((formatChar === '\\' || formatChar === '#') && prevFormatChar === '\\')) {
finalString += formatChar;
}
}
}
return finalString;
};
更好地做一个快捷方式,它的话,这句法,没有地方走了一会儿。 ;)你可以做的最好的事情就像是一个`sprintf`函数,但是这不会让事情变得更短。 – deceze 2011-01-20 03:24:07
查看重复问题中评分最高的答案。 – Phrogz 2011-01-20 04:56:25
ECMAscript 6有模板字符串...所以是的,将来您可以使用\字符串文本$ {表达式}字符串文本\`:https://developer.mozilla.org/en-US/docs/ Array.join的Web/JavaScript/Reference/template_strings – Ajedi32 2015-02-05 15:52:39