ES6的全新特性:模板字符串

作为JavaScript的未来,ES6已经到来。作为已完成的标准,ES6带来了许多新特性使其在如今的web世界仍有竞争力。ES6的方方面面不一定全都适合你,本文集会简要介绍一些顺手且可行的新特性。

我编写JavaScript代码更喜欢使用单引号来定义字符串,而不是双引号。对JavaScript来说两者都可以,下面的两行代码其实作用相同:

  1. var animal = "cow";
  2. var animal = ‘cow‘;

我更喜欢单引号是有原因的。首先,单引号在组合使用HTML字符串和引用属性时更加方便。

  1. // with single quotes, there‘s no need to
  2. // escape the quotes around the class value
  3. var but = ‘<button class="big">Save</button>‘;
  4. // this is a syntax error:
  5. var but = "<button class="big">Save</button>";
  6. // this works:
  7. var but = "<button class=\"big\">Save</button>";

只有在 HTML 中使用单引号之时才需要转义,而HTML中是极少使用单引号的。我能想到的场景无非是内联 JavaScript 或 CSS,也就是说此时写的东西是靠不住的或者极度依赖标记语言。而在正文中,还不如使用排版更悦目的`‘`而不是单引号`‘`。[^注: 也就是说不用转义了。]

旁注: 当然,HTML相当宽容,你大可以删除引号或者转而使用单引号来包裹属性,但是我宁愿写可读性更好的标记语言而不是过分依赖语法分析程序。如今的HTML5语法分析程序如此宽容是因为过去人们写的标记语言太糟糕了,这不是继续糟糕下去的借口。

在 DHTML 时代在框架集内部使用 document.writer 在新弹出窗口上创建文档之类的令人恶心的事情我已经受够了。我再也不要使用转义字符了。我甚至有时候还会用到三引号,这还是在编辑器有彩色高亮之前的事。简直是一团糟。

在字符串中使用变量替换

我更喜欢单引号还有一个原因。在编写高性能要求的网站时候我会大量使用PHP,而PHP是区分单引号和双引号的。PHP的单引号不允许字符串内变量替换,而双引号允许。

也就是说在 PHP 3 和 PHP 4 时代使用单引号的效率更高,因为语法分析程序省去了检索整个字符串进行变量替换的麻烦。看下面的例子你就明白了:

  1. <?php $animal = ‘cow‘;
  2. $sound = ‘moo‘;
  3. echo ‘The animal is $animal and its sound is $sound‘;
  4. // => The animal is $animal and its sound is $sound
  5. echo "The animal is $animal and its sound is $sound";
  6. // => The animal is cow and its sound is moo
  7. ?>

JavaScript不支持字符串内的变量替换,所以不得不使用拼接字符串来代替。这显然太麻烦了,不得不频繁地在引文内和引文外来回切换。

  1. var animal = ‘cow‘;
  2. var sound = ‘moo‘;
  3. alert(‘The animal is ‘ + animal + ‘ and its sound is ‘ +
  4. sound);
  5. // => "The animal is cow and its sound is moo"

多行字符串的麻烦

在处理越来越长的字符串,尤其是组合使用大量 HTML 的时候真的是麻烦异常。而且很可能到头来 Linting 工具会报错说行末的 + 后面有个多于的空格。这问题完全是因为JavaScript不支持多行字符串。

  1. // 这样写是不行的:
  2. var list = ‘<ul>
  3. <li>Buy Milk</li>
  4. <li>Be kind to Pandas</li>
  5. <li>Forget about Dre</li>
  6. </ul>‘;
  7. // 可以这样写,但是,呃
  8. var list = ‘<ul>\
  9. <li>Buy Milk</li>\
  10. <li>Be kind to Pandas</li>\
  11. <li>Forget about Dre</li>\
  12. </ul>‘;
  13. // 这是最常见的写法,但是,呃
  14. var list = ‘<ul>‘ +
  15. ‘ <li>Buy Milk</li>‘ +
  16. ‘ <li>Be kind to Pandas</li>‘ +
  17. ‘ <li>Forget about Dre</li>‘ +
  18. ‘</ul>‘;

客户端的模板解决方法

为了在搞定麻烦的JavaScript字符串处理和拼接问题,还是得走到老路上,写个库。现有的众多HTML模板库中,Mustache.js 大概是影响力最大的。这些库大都遵循自定的非标准语法,使用起来完全看心情。打个比方,这就像是你用markdown格式写东西,然后意识到”markdown”本身就有很多不同的意思。[注:markdown有众多风格]

使用模板字符串

随着ES6及其标准的到来,我们欣喜地发现使用JavaScript处理字符串时可以使用模板字符串了。现在主流浏览器对模板字符串的支持非常及时:Chrome 44+, Firefox 38+, Microsoft Edge 和 Webkit 全部支持。遗憾的是 Safari 尚未支持,但是也不会等很久。

模板字符串的设计天才之处在于使用了全新的字符串限定符,即在HTML和寻常文本中皆不常见的反引号(`)。

  1. var animal = ‘cow‘;
  2. var sound = ‘moo‘;
  3. alert(`The animal is ${animal} and its sound is ${sound}`);
  4. // => "The animal is cow and its sound is moo"

${} 接受任意的 JavaScript 表达式并返回相应值,可以用来进行数学运算或者访问对象的属性等等。

  1. var out = `ten times two totally is ${ 10 * 2 }`;
  2. // => "ten times two totally is 20"
  3. var animal = {
  4. name: ‘cow‘,
  5. ilk: ‘bovine‘,
  6. front: ‘moo‘,
  7. back: ‘milk‘,
  8. }
  9. alert(`
  10. The ${animal.name} is of the
  11. ${animal.ilk} ilk,
  12. one end is for the ${animal.front},
  13. the other for the ${animal.back}
  14. `);
  15. // =>
  16. /*
  17. The cow is of the
  18. bovine ilk,
  19. one end is for the moo,
  20. the other for the milk
  21. */

第二个例子表明多行字符串再也不是个问题啦。

标签化的模板

还可以在模板字符串之前加上一个标签,用作函数名,可以调用这个函数而字符串就是参数。下面的例子实现了对返回的字符串进行编码生成URL,避免总是使用不友好的 namedencodeURIComponent。

  1. function urlify (str) {
  2. return encodeURIComponent(str);
  3. }
  4. urlify `http://beedogs.com`;
  5. // => "http%3A%2F%2Fbeedogs.com"
  6. urlify `woah$£$%£^$"`;
  7. // => "woah%24%C2%A3%24%25%C2%A3%5E%24%22"
  8. // nesting also works:
  9. var str = `foo ${urlify `&&`} bar`;
  10. // => "foo %26%26 bar"

这样是能用是能用,却依赖于隐式的数组到字符串的强制转换。传递给函数的元素并不是字符串,而是字符串和值构成的数组。如果像上面这样使用,为了方便会被自动转换成字符串,但是正确的方法是直接访问数组成员。

在模板字符串中检索字符串和值

在标签函数内部,不仅可以使用完整字符串,还可以只使用字符串的一部分。

  1. function tag (strings, values) {
  2. console.log(strings);
  3. console.log(values);
  4. console.log(strings[1]);
  5. }
  6. tag `you ${3+4} it`;
  7. /* =>
  8. Array [ "you ", " it" ]
  9. 7
  10. it
  11. */

你还可以使用原始字符串的数组,这意味着可以获取字符串中的所有字符,这里说的「所有」是指包括控制字符[^注:非打印字符]。比如在添加换行时使用的 \n 就是控制字符。在字符串中只能得到两个空格,而在原始字符串中可以取得 \n 字符。

  1. function tag (strings, values) {
  2. console.log(strings);
  3. console.log(values);
  4. console.log(strings[1]);
  5. console.log(string.raw[1]);
  6. }
  7. tag `you ${3+4} \nit`;
  8. /* =>
  9. Array [ "you ", " it" ]
  10. 7
  11. it
  12. \nit
  13. */

结论

模板字符串是ES6引入的超赞小特性,现在就可以使用。如果需要支持更老旧的浏览器,当然还可以把 ES6 转换编译 [注:transpile] 回 ES5。还可以针对模板字符串做一下特性检测,使用诸如 featuretests.io 的库,或者用下面的代码:

  1. var templatestrings = false;
  2. try {
  3. new Function( "`{2+2}`" );
  4. templatestrings = true;
  5. } catch (err) {
  6. templatestrings = false;
  7. }
  8. if (templatestrings) {
  9. // …
  10. }原文链接:http://www.gbtags.com/gb/share/9579.htm
时间: 2024-10-07 02:43:06

ES6的全新特性:模板字符串的相关文章

ES6 &amp;&amp; ECMAScript2015 新特性

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. 虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了.所以就算你现在不打算使用ES6,但为了看懂别人的你也该懂点ES6的语法了- 在我们正式讲解ES6语法之前,我们得先了解下Babel.Babel Babel是一个广泛使用的ES6转码器,可以将ES6

ES6新特性之模板字符串

ES6新特性概览  http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串   http://www.infoq.com/cn/articles/es6-in-depth-template-string

ES6特性-带标签的模板字符串(tagged template)

tagged template: 加在模板字符串前面加一个标签(函数). let dessert = = '甜品' drink = '茶' let breakfast = kitchen`今天的早餐是${dessert} 与 ${drink}!` function kitchen(strings,...values){ console.log(strings); console.log(values); } strings和value都是数组,里面分别是string和value: 原文地址:ht

深入浅出ES6(四):模板字符串

作者 Jason Orendorff  github主页  https://github.com/jorendorff 反撇号(`)基础知识 ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings).除了使用反撇号字符 ` 代替普通字符串的引号 ' 或 " 外,它们看起来与普通字符串并无二致.在最简单的情况下,它们与普通字符串的表现一致: context.fillText(`Ceci n'est pas une chaîne.`, x, y); 但是我们并

ES6中模板字符串的使用

要把多个字符串连接起来,可以用"+"号连接: var name = '张三'; var sex = '男';var age= 18; var message = '姓名:'+name + ',性别:' + sex +',今年' + age + '岁了!'; alert(message); ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量: var name = '张三'; var age = 18; alert(`姓名:${name}, 年龄:

ES6模板字符串

看了阮老师的ES6入门再加上自己的一些理解整理出的学习笔记 介绍: 样子: `` 反引号,tab上面的那个键,同该符号包裹的字符串能够带来的功能如下: 可以包涵换行 在反引号以内,可以有多个换行,都能够在使用的时候被识别 可以嵌入变量 使用美元符号和大括号包裹变量${对象名.属性名} 可以原生输出  原生输出包含转义字符串的内容String.raw模板字符串 例子: 传统的JavaScript语言,输出模板通常是这样写的,字符串拼接很让人头疼,也很容易出错. $('#result').appen

ES6新语法之---对象字面量扩展、模板字符串(5)

这节课学习ES6中对象字面量扩展和新增模板字符串 第一部分:对象字面量扩展 1.简洁写法 ES6对于对象字面量属性提供了简写方式. 1.1:属性简写 //传统写法 var x = 2, y = 3, o = { x: x, y: y }; //ES6简洁写法 var x = 2, y = 3, o = { x, //属性名和赋值变量名相同时,可简写 y }; 1.2:方法简写 //传统写法 var o = { x: function() { //... }, y: function() { //

ES6多行字符串+模板字符串

多行字符串 最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ` ... ` 表示: 'use strict'; // 如果浏览器支持模板字符串,将会替换字符串内部的变量: var name = '小明'; var age = 20; console.log(`你好, ${name}, 你今年${age}岁了!`); 如果有很多变量需要连接,用+号就比较麻烦.ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量: var name = '小明'; v

ES6中的模板字符串---反引号``

在react中,反引号``有特殊的含义. 如MDN中所述,模板字符串(Template literals)允许嵌入表达式,并且支持多行字符串和字符串插补特性.基本语法为以下几种: 其中第一行为最基本用法,即使用反引号 ('`') 来代替普通字符串中的用双引号和单引号. 第二行为多行字符串用法,即反引号中文本可以直接接受换行而不必使用\n换行符来强制换行. 第三行则为模板字符串的最核心用法,即反引号中的${expression}占位符中expression可以为任意的JavaScript表达式,甚