2010-07-21 68 views

回答

264

從Firefox 34 /鉻41/Safari瀏覽器啓動功能9 /微軟邊緣,你可以使用一個ES2015/ES6的功能,稱爲Template Literals,並使用此語法:

`String text ${expression}` 

模板文字由備註(``)(重音符號)代替雙引號或單引號。

例子:

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

如何整潔是什麼?

獎勵:

它還支持多行字符串在JavaScript中沒有逃逸,這是偉大的模板:

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

Browser support

由於這個語法是不受舊版瀏覽器支持(Internet Explorer和Safari < = 8),您可能需要使用Babel將代碼轉換成ES5以確保它可以在任何地方運行。


旁註:

從IE8開始+,你可以使用基本的字符串內console.log格式:

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

千萬不要錯過模板字符串是用back ticks(\')而不是普通引號字符分隔的事實。 '「$ {foo}」'實際上就是$ {foo} '''{{foo} \''是你真正想要的 – Hovis 2015-06-22 17:17:17

+1

也有許多轉換器將ES6轉換成ES5來解決兼容性問題! – Omid 2015-10-06 10:14:03

145

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge,nope,這在JavaScript中是不可能的。您將不得不訴諸於:

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

它將很快就可以在JavaScript(ES6)與模板字符串,看我下面詳細的解答。 – bformet 2015-01-22 12:52:09

+0

[它是可能](http://stackoverflow.com/a/28497562/1189651)如果你喜歡編寫CoffeeScript,它實際上是一個更好的語法的JavaScript。 – bformet 2015-02-13 10:37:19

37

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge,no。雖然你可以嘗試sprintf for JavaScript拿到一半了:

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

謝謝。如果你使用dojo,sprintf可作爲一個模塊使用: http://bill.dojotoolkit.org/api/1。9/dojox/string/sprintf – user64141 2014-07-14 16:23:57

4

如果你想爲microtemplating做插值,我喜歡Mustache.js用於這一目的。

18

以及你能做到這一點,但它不是ESP一般

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

你可以很容易地編寫智能做到這一點,如果你真的需要

+1

不錯,但我會想象會有性能問題。 – 2017-01-05 14:02:23

7

如果你喜歡寫的CoffeeScript你可以這樣做:

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

CoffeeScript實際上是javasc ript,但語法更好。

有關CoffeeScript的概述,請檢查此beginner's guide

3

你可以使用這個javascript函數來做這種模板。無需包含整個庫。

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

輸出"I would like to receive email updates from this store FOO BAR BAZ."

使用函數作爲參數的與string.replace()函數是ECMAScript的v3的規範的一部分。有關更多詳細信息,請參閱this SO answer

+0

這是否高效? – momomo 2017-07-05 17:00:25

+0

效率將在很大程度上取決於用戶的瀏覽器,因爲此解決方案委託匹配正則表達式以及對瀏覽器的本機函數進行字符串替換的「繁重工作」。無論如何,因爲無論如何這都發生在瀏覽器端,效率並不是如此巨大的問題。如果您想要服務器端模板(對於Node.JS等),您應該使用由@bformet描述的ES6模板文字解決方案,因爲它可能更有效。 – Eric 2017-07-05 18:49:27

5

完整回答問題,隨時可以使用:

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

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

呼叫作爲

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

附加該String.prototype:

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

然後爲使用:

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

我寫這NPM包stringinject https://www.npmjs.com/package/stringinject它允許你做以下

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

將取代{0}和{1}與數組項,並返回下面的字符串

"this is a test string for stringInject" 

,或者你可以替換對象鍵佔位符和值,就像這樣:

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

"My username is tjcafferkey on Github" 
0

那麼,你可以使用this is ${variable}或者你可以使用"this is "+variable 這兩個工作都很好。

還記得使用this is ${variable},而不是「或」周圍的蒂爾達(``)鍵

+0

這個答案看起來像重複。 – 2017-11-04 21:25:38

相關問題