Я устал писать это:
string_needed = "prefix....." + topic + "suffix...." + name + "testing";
Я бы подумал, что кто-то мог бы что-то сделать по этому поводу;)
Я устал писать это:
string_needed = "prefix....." + topic + "suffix...." + name + "testing";
Я бы подумал, что кто-то мог бы что-то сделать по этому поводу;)
В ES6 добавлены строки шаблонов, в которых вместо одинарных или двойных кавычек используются символы обратной черты ('). В строке шаблона вы можете использовать синтаксис ${}
для добавления выражений. Используя ваш пример, это будет:
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 не поддерживает строчную интерполяцию.
Единственный способ - реализовать его самостоятельно или использовать сторонний lib, который сделает это за вас.
ИЗМЕНИТЬ
Как добавил Маркос в комментариях, предложение 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."
Подробнее см. здесь.
Я просто написал эту хакерскую функцию, чтобы сделать это. Используется следующее:
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;
};