当前位置:  开发笔记 > 编程语言 > 正文

如何在JavaScript中进行字符串插值?

如何解决《如何在JavaScript中进行字符串插值?》经验,为你挑选了11个好方法。

考虑以下代码:

var age = 3;

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

除了字符串连接之外,还有其他方法可以将变量的值插入字符串吗?



1> Damjan Pavli..:

从ES6开始,您可以使用模板文字:

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


2> thefourtheye..:

TL;博士

如果适用,请使用ECMAScript 2015的模板字符串文字.

说明

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

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

您可以在其中使用任何有效的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用户,现在对此感到好奇,这个测试床可以用来玩,直到每个人都得到支持.


如果您使用[babeljs](https://goo.gl/8HHxG0),它可以使用,因此您可以在代码库中引入它,然后在您需要支持的浏览器实现它之后再删除转换步骤.
对于观众视力不佳的人来说,"性格不同于".如果您无法使用此功能,请确保使用严重的报价(也称为倾斜报价,返回报价)https://en.wikipedia.org/wiki/Grave_accent.它位于键盘的左上角:)

3> Chris Nielse..:

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的原型,您可以始终将其调整为独立的,或将其放入其他名称空间或其他任何名称空间.


注意:这比连接慢十倍.
并且需要大约三倍的击键次数和字节数.
@george:我的机器上的快速测试给了7312 ns的"牛说moo,moo,moo!" 使用Crockford的方法vs 111 ns进行预编译函数,该函数将变量拉出传递的对象并将它们与模板字符串的常量部分连接起来.这是Chrome 21.
或者使用它:""{0}说{1},{1},{1}!".取代(['cow','moo'])
@roosteronacid - 你能否对速度降低有所了解?例如,从0.01s到0.1s(重要)或从0.000000001s到0.00000001s(不相关)?

4> greg.kindel..:

注意事项:避免使用任何不允许你逃避自己的分隔符的模板系统.例如,使用supplant()此处提到的方法无法输出以下内容.

"感谢我的{age}变量,我已经3岁了."

简单插值可能适用于小型自包含脚本,但通常会出现这种设计缺陷,限制任何严重的使用.老实说,我更喜欢DOM模板,例如:

I am years old!

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

或者,如果您只是厌倦了字符串连接,那么总会有替代语法:

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


旁注:`Array.join()`比直接(`+`样式)连接慢,因为浏览器引擎(包括V8,包括节点和几乎所有运行JS的东西)已经大量优化它并且有很多优点支持[直接连接]的差异(http://jsperf.com/string-concatenation/47)
你的主要答案似乎是假设这个javascript在浏览器环境中运行,即使问题没有用HTML标记.
关于"取代"的"谨慎"是没有根据的:"我感谢我的{age}变量,我已经3岁了.".supplant({}));`完全返回给定的字符串.如果给出`age`,仍然可以使用`{{age}}`打印`{`和`}`

5> NawaMan..:

试试sprintf.例如:

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



6> shuckster..:

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

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



7> Jefferey Cav..:

当我不知道如何正确地使用这种模式时,我会在很多语言中使用这种模式,只是想快速得到一个想法:

// 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'



8> Mohammad Ari..:

你可以轻松地使用ES6 template string并使用任何可用的transila像babel一样转换到ES5.

const age = 3;

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

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



9> zs2020..:

试试kiwi,一个用于字符串插值的轻量级JavaScript模块.

你可以做

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

要么

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



10> Lucas Trzesn..:

这是一个需要您为对象提供值的解决方案.如果不提供对象作为参数,则默认使用全局变量.但更好地坚持使用参数,它更清洁.

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();


11> 小智..:

如果要对console.log输出进行插值,则只需

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

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有