Подтвердить что ты не робот

Все, что похоже на javascript на ruby ​​# {value} (строка интерполяции)

Я устал писать это:

string_needed = "prefix....." + topic + "suffix...." + name + "testing";

Я бы подумал, что кто-то мог бы что-то сделать по этому поводу;)

4b9b3361

Ответ 1

ES6 Обновление:

В 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

Ответ 2

Вы можете использовать coffeescript, чтобы написать код (который имеет интерполяцию, например Ruby, т.е. # {foo}).

Он "компилируется" до javascript, поэтому вы получите javascript, как то, что вы написали, но без необходимости писать/поддерживать код +++, который вам надоел

Я понимаю, что просить вас рассмотреть другой язык на грани правильного ответа или нет, но учитывая, как работает coffeescript, и что один из ваших тегов - Ruby, я надеюсь, что это пройдет.

Ответ 3

Как любопытство 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

Используя его на чем-либо, кроме строковых литералов, задается проблема, и он, вероятно, довольно медленный (хотя я и не измерял). Просто подумал, что дам вам знать.

Ответ 4

Прямой ответ: 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."

Подробнее см. здесь.

Ответ 5

Я просто написал эту хакерскую функцию, чтобы сделать это. Используется следующее:

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;
};