我怎样才能做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!`);
尝试猕猴桃 ,一个轻量级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
有这种内置的插值支持。