我怎样才能做JavaScript的string插值?

考虑这个代码:

var age = 3; console.log("I'm " + age + " years old!"); 

除string连接外,还有其他的方法可以将variables的值插入到string中吗?

TL;博士

如果适用,请使用ECMAScript 2015的模板string文字。

说明

根据ECMAScript 5规范,没有直接的方法可以做,但ECMAScript 6有模板string ,在规范的起草过程中也称为准文字 。 像这样使用它们:

 > var n = 42; undefined > `foo${n}bar` 'foo42bar' 

您可以在{}内使用任何有效的JavaScriptexpression式。 例如:

 > `foo${{name: 'Google'}.name}bar` 'fooGooglebar' > `foo${1 + 3}bar` 'foo4bar' 

另一个重要的是,你不必担心多行string了。 你可以简单地写成

 > `foo ... bar` 'foo\n bar' 

注:我使用io.js v2.4.0来评估上面显示的所有模板string。 您也可以使用最新的Chrome来testing上面显示的示例。

注意: ES6规范现在已经完成 ,但尚未被所有主stream浏览器实现。
根据Mozilla开发者networking页面 ,这将被实施为从以下版本开始的基本支持:Firefox 34,Chrome 41,Internet Explorer 12.如果您是Opera,Safari或Internet Explorer用户,并且对此感到好奇, 这个testing床可以用来玩,直到每个人都得到这个支持。

Douglas Crockford的Remedial JavaScript包含一个String.prototype.supplant函数。 它简短,熟悉,易于使用:

 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; } ); }; // Usage: alert("I'm {age} years old!".supplant({ age: 29 })); alert("The {a} says {n}, {n}, {n}!".supplant({ a: 'cow', n: 'moo' })); 

如果你不想改变string的原型,你可以随时调整它的独立,或将其放置在其他名称空间或其他任何地方。

自ES6以来,你可以写:

 let age = 3; console.log(`I'm ${age} years old!`); 

谨慎的语言:避免任何模板系统,不允许你逃脱自己的分隔符。 例如,使用这里提到的supplant()方法将无法输出以下内容。

“我3岁,感谢我的{年龄}variables。”

简单的插值可能适用于小型自包含脚本,但通常伴随着这种devise缺陷,会限制任何严重的使用。 老实说我更喜欢DOM模板,比如:

 <div> I am <span id="age"></span> years old!</div> 

并使用jQuery操作: $('#age').text(3)

或者,如果您只是厌倦了string连接,则总是会有其他的语法:

 var age = 3; var str = ["I'm only", age, "years old"].join(" "); 

试试sprintf 。 例如:

 vsprintf('The first 4 letters of the english alphabet are: %s, %s, %s and %s', ['a', 'b', 'c', 'd']); 

你可以使用Prototype的模板系统,如果你真的想用大锤来打破坚果:

 var template = new Template("I'm #{age} years old!"); alert(template.evaluate({age: 21})); 

我在很多语言中使用这种模式,但是我不知道如何正确地做到这一点,而只是想快速了解一下:

 // JavaScript var stringValue = 'Hello, my name is {name}. You {action} my {relation}.' .replace(/{name}/g ,'Indigo Montoya') .replace(/{action}/g ,'killed') .replace(/{relation}/g,'father') ; 

虽然不是特别高效,我觉得它是可读的。 它始终有效,并始终可用:

 ' VBScript dim template = "Hello, my name is {name}. You {action} my {relation}." dim stringvalue = template stringValue = replace(stringvalue, "{name}" ,"Luke Skywalker") stringValue = replace(stringvalue, "{relation}","Father") stringValue = replace(stringvalue, "{action}" ,"are") 

总是

 * COBOL INSPECT stringvalue REPLACING FIRST '{name}' BY 'Grendel' INSPECT stringvalue REPLACING FIRST '{relation}' BY 'Mother' INSPECT stringvalue REPLACING FIRST '{action}' BY 'did unspeakable things to' 

更新 :我已经更新的JavaScript版本,以取代所有的发生,而不是只是第一个。

您可以使用ES6 template string轻松使用任何可用的transpilar(如babel)将其转换为ES5。

 const age = 3; console.log(`I'm ${age} years old!`); 

http://www.es6fiddle.net/im3c3euc/

尝试猕猴桃 ,一个轻量级JavaScript模块进行string插值。

你可以做

 Kiwi.compose("I'm % years old!", [age]); 

要么

 Kiwi.compose("I'm %{age} years old!", {"age" : age}); 

这是一个解决scheme,要求您提供一个值的对象。 如果你不提供一个对象作为参数,它将默认使用全局variables。 但更好地坚持使用参数,它更干净。

 String.prototype.interpolate = function(props) { return this.replace(/\{(\w+)\}/g, function(match, expr) { return (props || window)[expr]; }); }; // Test: // Using the parameter (advised approach) document.getElementById("resultA").innerText = "Eruption 1: {eruption1}".interpolate({ eruption1: 112 }); // Using the global scope var eruption2 = 116; document.getElementById("resultB").innerText = "Eruption 2: {eruption2}".interpolate(); 
 <div id="resultA"></div><div id="resultB"></div> 

另一个大锤: jquery-tmpl (用jQuery模板化)。

使用`(Grave重音)而不是单引号(')或双引号(“)和$ {your-varialbe}

例如。 current date: ${new Date()}

Greg Kindel的第二个回答扩大了,你可以写一个函数来消除一些样板:

 var fmt = { join: function() { return Array.prototype.slice.call(arguments).join(' '); }, log: function() { console.log(this.join(...arguments)); } } 

用法:

 var age = 7; var years = 5; var sentence = fmt.join('I am now', age, 'years old!'); fmt.log('In', years, 'years I will be', age + years, 'years old!'); 

如果你想插入在console.log输出,那么只是

 console.log("Eruption 1: %s", eruption1); ^^ 

这里, %s就是所谓的“格式说明符”。 console.log有这种内置的插值支持。