Node.js 4.0.0 新特性:模板字符串(Template Strings)

撰写于 2015年9月13日 修改于 2016年7月23日 分类 前端代码与禅 标签 JavaScript / Node.js

前两天新发布的 Node.js 4.0.0 稳定版,总算让 Node.js 用上了新的 V8 4.5,也使得 V8 中的 ECMAScript 6 新特性终于来到了 Node.js,除了引入注目的类型数据、箭头函数一类,还有个模板字符串(Template Strings),使得广大 Node.js 程序员可以用原生的方法来进行相对复杂的字符串处理了。

蛮荒时代

在以前,如果要处理一个多行的字符串,你得:

1
2
3
4
5
// \\n 是为了高亮插件的显示,实际应为 \n
console.log('鹅,鹅,鹅,\\n\
曲项向天歌。\\n\
白毛浮绿水,\\n\
红掌拨清波。');

当然,老成一点的,还知道可以用数组进行组合。

1
2
3
4
console.log(['鹅,鹅,鹅,',
'曲项向天歌。',
'白毛浮绿水,',
'红掌波清波。'].join('\\n'));

那如果要在字符串中插入变量呢?

1
2
3
var person = {name: 'Sid', location: 'Shanghai'};
console.log('person: ' + JSON.stringify(person) + ' is here');
// person:{"name":"Sid","location":"Shanghai"} is here

或者这样:

1
2
console.log('person:', person, 'is here');
// person: { name: 'Sid', location: 'Shanghai' } is here

没错,一个都没让人省心。

闪亮登场

模板字符串出场了,它就是为了解决上面这些问题。与变通字符串使用单双引号来包裹值不一样,模板字符串用的是

1
2
3
4
5
6
```js
console.log(` 鹅,鹅,鹅,
曲项向天歌。
白毛浮绿水,
红掌波清波。`);

既然称之为模板,当然也就具有模板的一些功能:

1
2
3
4
5
6
7
8
9
var nameHe = 'Li Lei', nameShe = 'Han Meimei';
console.log(`
this is ${nameHe},
this is ${nameShe}`
, nameHe);
/*
this is Li Lei,
this is Han Meimei Li Lei
*/

还可以直接执行表达式:

1
2
3
var intA = 10;
console.log(`Math.sqrt(3):${Math.sqrt(3)}, intA^2: ${intA * intA}`);
// Math.sqrt(3):1.7320508075688772, intA^2: 100

此外,可以组织一个函数,来专门处理模版字符串,类似于这样:

1
2
3
4
5
6
7
8
9
10
function taggedTS() {
console.log('arguments:', arguments);
}
taggedTS `This is ${intA} and sqrt: ${Math.sqrt(intA)}`
/*
arguments: { '0': [ 'This is ', ' and sqrt: ', '' ],
'1': 10,
'2': 3.1622776601683795 }
*/

注意,虽然看起来像个普通的函数,但在调用的时候,不能使用括号,而是直接用函数名加模板字符串的方式。传入的参数,分为两部分,第一个是被动态的值所分隔的多个字符串,后面是对应的各个动态值的计算结果。

安全问题

与SQL注入一样,如果要把用户的输入直接作为模板字符串的内容,务必先进行仔细的检查,因为恶意的输入者,可能会通过猜测变量名,来获取你程序中比较危险的值。

Site by Yifei Zhang using Hexo & Random

Yifei Zhang的博主是一名Node.js程序员,博客的内容会涉及电影 / 生活 / 吐槽 / JavaScript / PHP / Node.js / Express / MongoDB / MySQL / Redis / AngularJS / jQuery / HTML。

Hide