资讯专栏INFORMATION COLUMN

ES2018 新特征之:非转义序列的模板字符串

stackfing / 2502人阅读

摘要:新特性异步迭代器正则表达式反向断言正则表达式转义非转义序列的模板字符串本文正则表达式模式正则表达式命名捕获组对象展开运算符这个提案由负责,目前已经进入,本提案是的一部分。因此标准移除了对在带标签的模版字符串中转义序列的语法限制。

ES2018 新特性

异步迭代器

正则表达式反向(lookbehind)断言

正则表达式 Unicode 转义

非转义序列的模板字符串(本文)

正则表达式 s/dotAll 模式

正则表达式命名捕获组

对象展开运算符

Promise.prototype.finally

这个 ECMAScript 提案 “Template Literal Revision” 由 Tim Disney 负责,目前已经进入 stage 4,本提案是 ECMAScript 2018(ES9) 的一部分。该提案让我们使用模板字符串的标签函数语法更加的自由。

1. 标签函数 Tagged templates

标签使您可以用函数解析模板字符串。标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。最后,你的函数可以返回处理好的的字符串(或者它可以返回完全不同的东西)。

function foo(str) {
    return str[0].toUpperCase();
}

foo`justjavac`; // 输出 JUSTJAVAC
foo`Xyz`; // 输出 XYZ
2. String.raw()

String.raw() 是一个模板字符串的标签函数,它的作用类似于 Python 中的字符串前缀 r 和 C# 中的字符串前缀 @,是用来获取一个模板字符串的原始字面量值的。

语法:

String.raw(callSite, ...substitutions)
String.raw`templateString`

String.raw() 是唯一一个内置的模板字符串标签函数。

var str = String.raw`Hi
${2+3}!`;
// "Hi
5!"

str.length;
// 字符串长度为 6

str.split("").join(",");
// 分隔字符串
// 结果是:"H,i,,n,5,!"
3. 原始字符串

在标签函数的第一个参数中,存在一个特殊的属性 raw,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。

function foo(str) {
    console.log(str);
    return str[0].toUpperCase();
}

foo`justjavac`;

// 控制台输出
["justjavac", raw: ["justjavac"]]

foo`justjavac`;
// 控制台输出
["justjavac", raw: ["justjavac"]]
4. 带标签函数的转义序列

自 ES2016 起,带标签的模版字面量遵守以下转义序列的规则:

Unicode字符以"u"开头,例如 u00A9

Unicode码位用"u{}"表示,例如 u{2F804}

十六进制以"x"开头,例如 xA9

八进制以""和数字开头,例如 251

对于每一个 ECMAScript 语法,解析器都会去查找有效的转义序列,对于无效的转义序列,直接抛出 SyntaxError

String.raw``;
Uncaught SyntaxError: Unterminated template literal
5. ES2018 关于非法转义序列的修订

带标签函数的模版字符串应该允许嵌套支持常见转义序列的语言(例如 DSLs、LaTeX)。

因此 ECMAScript 2018 标准移除了对 ECMAScript 在带标签的模版字符串中转义序列的语法限制。

function tag(strs) {
  strs[0] === undefined
  strs.raw[0] === "unicode and u{55}";
}

// 在标签函数中使用
tag`unicode and u{55}`; // 结果是 undefined

// 不在标签函数中使用
let bad = `bad escape sequence: unicode`;
// throws early error:SyntaxError: Invalid Unicode escape sequence
6. 实现

V8 - Chrome 62

SpiderMonkey - Firefox 53

JavaScriptCore - 版本未知

ChakraCore - 开发中

Babel - 7.x

7. 相关链接:

https://github.com/tc39/propo...

https://tc39.github.io/propos...

https://developer.mozilla.org...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93145.html

相关文章

  • ES2018 特征:正则表达式 dotAll 模式

    摘要:或者使用来匹配空白字符增加标志在最新的规范中,为的正则表达式增加了一个新的标志用来表示。标志用于指定多行输入字符串应该被视为多个行。标志只影响和标志只影响目前在正则表示中所有修饰符的含义实现 ES2018 新特性 异步迭代器 正则表达式反向(lookbehind)断言 正则表达式 Unicode 转义 非转义序列的模板字符串 正则表达式 s/dotAll 模式(本文) 正则表达式命...

    Joyven 评论0 收藏0
  • ES2018 特征:异步迭代器 for-await-of

    摘要:不幸的是,迭代器不能用来表示这样的数据源。即使是的迭代器也是不够的,因为它的是异步的,但是迭代器需要同步确定状态。异步迭代器一个异步迭代器就像一个迭代器,除了它的方法返回一个的。 ES2018 新特性 异步迭代器(本文) 正则表达式反向(lookbehind)断言 正则表达式 Unicode 转义 非转义序列的模板字符串 正则表达式 s/dotAll 模式 正则表达式命名捕获组 对...

    klivitamJ 评论0 收藏0
  • 每个JavaScript开发人员都应该知道ES2018功能(译文)

    摘要:为了使程序员能够一次一个地处理集合中的元素,引入了迭代器接口。迭代器使用该方法获取对象属性名称的数组,然后将其分配给常量。迭代器的缺点是它们不适合表示异步数据源。每次循环时,都会调用迭代器的方法,它返回一个。 前言 原文地址:https://css-tricks.com/new-es2018-features-every-javascript-developer-should-kno...

    leonardofed 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<