2012-04-13 3 views
2

Есть ли лучший способ для создания строк в JavaScript, чем для конкатенации строк?Существует ли JavaScript-эквивалент последовательностей rubys "# {}"?

Это сделает мой код более чистым, если я смогу сделать что-то вроде ruby, где вы можете развернуть переменные в строке, а не делать много «foo» + bar + «baz».

ответ

0

Если вы имеете дело с большим строк затем, используя массив, в котором вы push струнные частей и в конце join их (с пустой строкой в ​​качестве разделителя), как представляется, является наиболее эффективным для всех платформ.

7
String.prototype.format = function() { 
    var args = arguments; 
    return this.replace(/{(\d+)}/g, function(match, number) { 
    return typeof args[number] != 'undefined' 
     ? args[number] 
     : match 
    ; 
    }); 
}; 


console.log("{0} bar {1}.".format("foo","baz")); 

будет производить:

"Foo бар Баз"

+0

В идеале, что бы заменить '# {...}', чтобы избежать коверкая строк, которые могут содержать фигурные скобки. Например, фрагмент кода JavaScript. – tadman

+0

никаких проблем, неважно, это просто поиск {number} и ничего больше. – pylover

0

"Есть ли эквивалент JavaScript из Rubys “#{}” последовательностей?"

По отношению к эквивалентной, нет. JavaScript изначально не имеет строковой интерполяции. Хотя вы могли бы использовать функцию, чтобы воспроизвести ее до некоторой степени.

1

Chris Nielsen предоставил решение чисто JavaScript в this answer:

String.prototype.supplant = function (o) { 
    return this.replace(/{([^{}]*)}/g, 
     function (a, b) { 
      var r = o[b]; 
      return typeof r === 'string' || typeof r === 'number' ? r : a; 
     } 
    ); 
}; 

alert("I'm {age} years old!".supplant({ age: 29 })); 
alert("The {a} says {n}, {n}, {n}!".supplant({ a: 'cow', n: 'moo' })); 

Вы можете также использовать CoffeScript, который является языком, который компилируется в JavaScript. It supports string interpolation:

author = "Wittgenstein" 
quote = "A picture is a fact. -- #{ author }" 
0

pylover's answer даст вам что-то вроде , что вы хотите.

Вы также можете заглянуть в CoffeeScript, что является хорошим языком, который скомпилирован для JavaScript и имеет строчную интерполяцию, среди прочих (возможно, тоже).

1

извините, ребята, но все это не очень рубиновый путь, вот базовый p-эквивалент, извините за eval, что, безусловно, можно сделать лучше .. , если вы просто хотите конкатенацию, просто замените document.write возвращением в первом растворе

function p(str){ 
    document.write(str.replace(/#{(\w)}/g, function(match, s){return eval(s)})+"<br>"); 
} 

String.prototype.p = function() { 
    return this.replace(/#{(\w)}/g, function(match, s){return eval(s)})+"<br>"; 
}; 


var f="foo", b="bar" 
p("#{f} #{b}") 
document.write("#{f} #{b}".p()); 

=> foo bar 
=> foo bar 

EDIT: я добавил версию прототипа, были некоторые трудности с этим одним