考虑这个代码:
var age = 3;
console.log("I'm " + age + " years old!");
除了字符串连接之外,还有其他方法可以将变量的值插入到字符串中吗?
考虑这个代码:
var age = 3;
console.log("I'm " + age + " years old!");
除了字符串连接之外,还有其他方法可以将变量的值插入到字符串中吗?
如果适用,请使用 ECMAScript 2015 的模板字符串文字。
根据 ECMAScript 5 规范,没有直接的方法可以做到这一点,但 ECMAScript 6 有模板字符串,在规范的起草过程中也被称为准文字。像这样使用它们:
> var n = 42;
undefined
> `foo${n}bar`
'foo42bar'
您可以在 .js 文件中使用任何有效的 JavaScript 表达式{}
。例如:
> `foo${{name: 'Google'}.name}bar`
'fooGooglebar'
> `foo${1 + 3}bar`
'foo4bar'
另一个重要的事情是,您不必再担心多行字符串。你可以简单地把它们写成
> `foo
... bar`
'foo\n bar'
注意:我使用 io.js v2.4.0 来评估上面显示的所有模板字符串。您还可以使用最新的 Chrome 来测试上面显示的示例。
注意: ES6 规范现已完成,但尚未被所有主要浏览器实现。
根据Mozilla 开发人员网络页面,这将在以下版本中实现基本支持:Firefox 34、Chrome 41、Internet Explorer 12。如果您是 Opera、Safari 或 Internet Explorer 用户并且现在对此感到好奇,这个测试床可以用来玩,直到每个人都得到支持。
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 的原型,您可以随时将其调整为独立的,或者将其放入其他一些命名空间,或其他任何内容。
注意事项:避免任何不允许您转义其自己的分隔符的模板系统。例如,使用supplant()
这里提到的方法将无法输出以下内容。
“由于我的 {age} 变量,我 3 岁了。”
简单的插值可能适用于小型自包含脚本,但通常带有这种设计缺陷,这将限制任何认真使用。老实说,我更喜欢 DOM 模板,例如:
<div> I am <span id="age"></span> years old!</div>
并使用 jQuery 操作: $('#age').text(3)
或者,如果您只是厌倦了字符串连接,总有替代语法:
var age = 3;
var str = ["I'm only", age, "years old"].join(" ");
当我还不知道如何正确使用这种模式并且只想快速获得一个想法时,我会在很多语言中使用这种模式:
// JavaScript
let 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'