2010-07-21 11 views

Odpowiedz

264

Zaczynając od Firefoksa 34/Chrome 41/Safari 9/Microsoft Edge można użyć ES2015/funkcja ES6 nazwie Template Literals i używać tej składni:

`String text ${expression}` 

Literały szablonów są dołączane przez tylny znacznik (``) (akcent grobowy) zamiast podwójnych lub pojedynczych cudzysłowów.

Przykład:

var a = 5; 
var b = 10; 
console.log(`Fifteen is ${a + b}.`); 
// "Fifteen is 15. 

Jak miłe jest to, że?

Bonus:

Pozwala także na smyczki multi-line w JavaScript bez ucieczki, który jest idealny dla szablonów:

return ` 
    <div class="${foo}"> 
     ... 
    </div> 
`; 

Browser support:

Ponieważ składnia nieobsługiwany przez starsze przeglądarki (Internet Explorer i Safari < = 8), możesz użyć Babel, aby przenieść swój kod do ES5, aby mieć pewność, że będzie działał wszędzie.


Notatka:

Począwszy od IE8 + można użyć podstawowy ciąg formatowanie wewnątrz console.log:

console.log('%s is %d.', 'Fifteen', 15); 
// Fifteen is 15. 
+22

Nie przegap faktu, że ciąg szablonu jest rozdzielany tylnymi znacznikami (\ ') zamiast zwykłych znaków cudzysłowu. '" $ {foo} "' to dosłownie $ {foo} '' '' '' '' '' '' '' '' 'to jest to, czego faktycznie potrzebujesz – Hovis

+1

Jest także wiele transpilerów, które zmieniają ES6 w ES5, aby naprawić problem ze zgodnością! – Omid

145

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, nie, nie było to możliwe w javascript. Trzeba by uciekać się do:

var hello = "foo"; 
var my_string = "I pity the " + hello; 
+2

Wkrótce będzie to możliwe w javascript (ES6) z szablonem Strings zobacz moją szczegółową odpowiedź poniżej. – bformet

+0

[Jest możliwe] (http://stackoverflow.com/a/28497562/1189651) jeśli lubisz pisać CoffeeScript, który faktycznie jest javascript z lepszą składnią – bformet

37

Prior to Firefox 34/Chrome 41/9/Safari Microsoft Edge, nie. Chociaż można spróbować sprintf for JavaScript dostać w połowie drogi:

var hello = "foo"; 
var my_string = sprintf("I pity the %s", hello); 
+0

Dzięki. Jeśli korzystasz z dojo, sprintf jest dostępny jako moduł: http://bill.dojotoolkit.org/api/1.9/dojox/string/sprintf – user64141

4

Jeśli próbujesz zrobić interpolacji dla microtemplating, lubię Mustache.js do tego celu.

18

dobrze można to zrobić, ale to nie jest esp ogóle

'I pity the $fool'.replace('$fool', 'fool') 

Można łatwo napisać funkcję, która robi to inteligentnie, jeśli naprawdę potrzebne do

+1

Dobrze, ale wyobrażam sobie, że będzie hit. –

7

Jeśli lubisz pisać coffeescript można zrobić:

hello = "foo" 
my_string = "I pity the #{hello}" 

CoffeeScript faktycznie JEST JAVAV ript, ale o znacznie lepszej składni.

Aby zapoznać się z przeglądem CoffeeScript, sprawdź to beginner's guide.

3

Możesz użyć tej funkcji javascript do tego typu szablonów. Nie trzeba uwzględniać całej biblioteki.

function createStringFromTemplate(template, variables) { 
    return template.replace(new RegExp("\{([^\{]+)\}", "g"), function(_unused, varName){ 
     return variables[varName]; 
    }); 
} 

createStringFromTemplate(
    "I would like to receive email updates from {list_name} {var1} {var2} {var3}.", 
    { 
     list_name : "this store", 
     var1  : "FOO", 
     var2  : "BAR", 
     var3  : "BAZ" 
    } 
); 

wyjściowy: "I would like to receive email updates from this store FOO BAR BAZ."

Stosując funkcję jako argument funkcji string.replace() jest częścią ECMAScript v3 spec. Aby uzyskać więcej informacji, patrz this SO answer.

+0

Czy to jest wydajne? – momomo

+0

Efektywność zależy w dużej mierze od przeglądarki użytkownika, ponieważ to rozwiązanie deleguje "ciężki lifting" dopasowywania regex i zastępowania ciągów do macierzystych funkcji przeglądarki. W każdym razie, ponieważ dzieje się tak po stronie przeglądarki, wydajność nie jest tak ogromnym problemem. Jeśli chcesz szablonować po stronie serwera (dla Node.JS lub podobnego), powinieneś użyć rozwiązania ES6 do szablonów opisanego przez @bformet, ponieważ prawdopodobnie jest bardziej wydajne. – Eric

5

pełna odpowiedź, gotowy do użycia:

var Strings = { 
     create : (function() { 
       var regexp = /{([^{]+)}/g; 

       return function(str, o) { 
        return str.replace(regexp, function(ignore, key){ 
          return (key = o[key]) == null ? '' : key; 
        }); 
       } 
     })() 
}; 

zadzwonić jako

Strings.create("My firstname is {first}, my last name is {last}", {first:'Neo', last:'Andersson'}); 

Aby dołączyć go do String.prototype:

String.prototype.create = function(o) { 
      return Strings.create(this, o); 
} 

Następnie użyj jako:

"My firstname is ${first}".create({first:'Neo'}); 
1

pisałem ten pakiet npm stringinject https://www.npmjs.com/package/stringinject który pozwala wykonać następujące czynności

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]); 

który zastąpi {0} i {1} z elementów tablicy i zwraca następujący ciąg

"this is a test string for stringInject" 

czy można zastąpić symbole zastępcze z kluczami przedmiotu i wartości tak:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); 

"My username is tjcafferkey on Github" 
0

Dobrze, możesz użyć this is ${variable} lub możesz użyć "this is "+variable Oba te działają dobrze.

również pamiętać, aby używać Tilda (``) klucz wokół this is ${variable} zamiast "lub"

+0

Ta odpowiedź wygląda na duplikat. –

Powiązane problemy