ES6里关于模板字面量的拓展

  JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串、字符串格式化、HTML转义等。ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系,通过一些全新的方法来解决类似的问题。

一、基本用法

  模板字面量是增强版的字符串,它用反引号(`)标识

二、多行字符串

  自javascript诞生起,开发者们就一直在寻找一种能创建多行字符串的方法。如果使用双引号或单引号,字符串一定要在同一行才行

1、反斜杠

  由于javascript长期以来一直存在一个语法bug,在换行之前的反斜线( \ )可以承接下一行的代码,于是可以利用这个bug来创建多行字符串,但是字符串打印输出时不会有换行,因为反斜线被视为延续符号而不是新行的符号。为了在输出中显示换行,需要手动加入换行符

var message = "Multiline \n\
string";
// "Multiline
// string"
console.log(message); 

  在所有主流的 JS 引擎中,此代码都会输出两行,但是该行为被认定为一个 bug ,并且许多开发者都建议应避免这么做。在ES6之前,通常都依靠数组或字符串的拼接来创建多行字符串。

var message = ["Multiline ","string"].join("\n");
let message = "Multiline \n" +"string";

  JS一直以来都不支持多行字符串,开发者的种种解决方法都不够完美。

2、反引号

  ES6 的模板字面量使多行字符串更易创建,因为它不需要特殊的语法,只需在想要的位置直接换行即可,此处的换行会同步出现在结果中。

let bb = `Multiline
string`;
// "Multiline
// string"
console.log(bb);
console.log(bb.length); // 16

  在反引号之内的所有空白符都是字符串的一部分,因此需要特别留意缩进。

  模板字面量里的所有空白符都被视为字符串自身的一部分

  当然,也可以在模板字面量中使用 \n 来指示换行的插入位置

let aaa=`aab\ndd`;
console.log(aaa,aaa.length)
//aab
//dd
//6

三、变量占位符

  模板字面量看上去仅仅是普通JS字符串的升级版,但二者之间真正的区别在于模板字面量的变量占位符。变量占位符允许将任何有效的JS表达式嵌入到模板字面量中,并将其结果输出为字符串的一部分。

  变量占位符由起始的 ${ 与结束的 } 来界定,之间允许放入任意的 JS 表达式。最简单的变量占位符允许将本地变量直接嵌入到结果字符串中。

let name = "Nicholas",
message = `Hello, ${name}.`;
console.log(message); // "Hello, Nicholas."

  占位符 ${name} 会访问本地变量 name ,并将其值插入到 message 字符串中。 message变量会立即保留该占位符的结果

  既然占位符是JS表达式,那么可替换的就不仅仅是简单的变量名。可以轻易嵌入运算符、函数调用等

let count = 10,
price = 0.25,
message = `${count} items cost $${(count * price).toFixed(2)}.`;
console.log(message); // "10 items cost $2.50."
function fn() {
  return "Hello World";
}

`foo ${fn()} bar`
// foo Hello World bar

  模板字面量本身也是 JS 表达式,因此可以将模板字面量嵌入到另一个模板字面量内部

let name = "Nicholas",
    message = `Hello, ${
        `my name is ${ name }`
    }.`;
console.log(message); // "Hello, my name is Nicholas."

四、标签模板

  模板字面量真正的威力来自于标签模板,每个模板标签都可以执行模板字面量上的转换并返回最终的字符串值。标签指的是在模板字面量第一个反引号‘`‘前方标注的字符串

let message = tag`Hello world`;
//在这个示例中, tag 就是应用到 `Hello world` 模板字面量上的模板标签

1、定义标签

  标签可以是一个函数,调用时传入加工过的模板字面量各部分数据,但必须结合每个部分来创建结果。第一个参数是一个数组,包含Javascript解释过后的字面量字符串,它之后的所有参数都是每一个占位符的解释值

  标签函数通常使用不定参数特性来定义占位符,从而简化数据处理的过程

function tag(literals, ...substitutions) {
  // 返回一个字符串
}

  为了进一步理解传递给tag函数的参数,查看以下代码

let count = 10,
price = 0.25,
message = passthru`${count} items cost $${(count * price).toFixed(2)}.`;

  如果有一个名为passthru()的函数,那么作为一个模板字面量标签,它会接受3个参数:

首先是一个literals数组,包含以下元素:

  1、第一个占位符前的空字符串("")

  2、第一、二个占位符之间的字符串(" items cost $")

  3、第二个占位符后的字符串(".")

下一个参数是变量count的解释值,传参为10,它也成为了substitutions数组里的第一个元素

最后一个参数是(count*price).toFixed(2)的解释值,传参为2.50,它是substitutions数组里的第二个元素

  注意:literals里的第一个元素是一个空字符串,这确保了literals[0]总是字符串的始端,就像literals[literals.length-1]总是字符串的结尾一样。substitutions的数量总比literals少一个,这也意味着表达式substitutions.Iength === literals.Iength-1的结果总为true

var a = 5;
var b = 10;

tag`Hello ${ a + b } world ${ a * b }`;
// 等同于
tag([‘Hello ‘, ‘ world ‘, ‘‘], 15, 50);

  通过这种模式,我们可以将literals和substitutions两个数组交织在一起重组结果字符串。先取出literals中的首个元素,再取出substitution中的首个元素,然后交替继续取出每一个元素,直到字符串拼接完成。于是可以通过从两个数组中交替取值的方式模拟模板字面量的默认行为。

function passthru(literals, ...substitutions) {
    let result = "";
    // 仅使用 substitution 的元素数量来进行循环
    for (let i = 0; i < substitutions.length; i++) {
        result += literals[i];
        result += substitutions[i];
    }
    // 添加最后一个字面量
    result += literals[literals.length - 1];
    return result;
}
let count = 10,
price = 0.25,
message = passthru`${count} items cost $${(count * price).toFixed(2)}.`;
console.log(message); // "10 items cost $2.50."

  这个示例定义了一个passthru标签,模拟模板字面量的默认行为,展示了一次转换过程。此处的小窍门是使用substitutions.length来为循环计数。

时间: 2024-11-07 22:40:47

ES6里关于模板字面量的拓展的相关文章

ES6模板字面量

前面的话 JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系,通过一些全新的方法来解决类似的问题.本文将详细介绍ES6模板字面量 基本用法 模板字面量是增强版的字符串,它用反引号(`)标识 let message = `Hello world!`; console.log(message); // "Hello world!" conso

在JavaScript里的“对象字面量”是什么意思?

字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量.字面量分为字符串字面量(string literal ).数组字面量(array literal)和对象字面量(object literal),另外还有函数字面量(function literal).示例:var test="hello world!";"hello world!"就是字符串字面量,test是变量名.

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深入浅出-2 新版函数:4 迭代器与生成器-1.字面量增强

今天的内容 字面量literal 写出来就是它的值 例如字符串hello.这就是自变量. 一个空对象,也是自变量 写出来就是代表它写出来的那个意思就是自变量. 与其相反的就是构造出来的.例如下面的new Object()就不是自变量. 非自变量就是构造出来的量 二进制 以前的二进制是怎么写的呢 以前的二进制基本没有什么用 十进制没有十 八进制没有八 二进制,是以0b开头的 es6新语法,以0b开头的是二进制.0o开头的是八进制 在es5里面0777代表是八进制. 新版的语法知识更好的理解而已.

ES6 - 对象扩展(增强字面量)

/** * 对象的扩展 * * 增强对象字面量 * * 解决问题:缩减代码 */ { /** * 1.属性简表示法 * 变量foo直接写在大括号里面.这时,属性名就是变量名, 属性值就是变量值 */ const foo = 'bar'; const baz = { foo }; // baz // {foo: "bar"} // 等同于 // const baz = { foo: foo }; /** * 方法简写 */ const o1 = { method() { return &

《ES6标准入门》29~48Page 字符串拓展 正则拓展

1.字符串的拓展 ES3允许使用类似\u0061这样的形式来表示字符,其中的数字是Unicode-8编码. 但如果超出\uffff的字符,必须使用双字节的形式表达,例如 \uD842\uDFB7. 在ES6中,可以用\u{20BB7}这种形式表示,其中数字是Unicode-16编码. 对于需要Unicode-16编码存储的字符,ES认为有2个字符.此时使用String.codePoinAt()方法,可以准确的识别字符串中的字符,如果需要遍历,则需要使用for...of循环. 与此相对,Strin

第3条:多用字面量语法,少用与之等价的方法

名词翻译: 语法糖(syntactic sugar):是指计算机语言中与另外一套语法等效,但是开发者用起来却更加方便的语法. 语法糖可令程序更易读,减少代码出错机率. 字面数值 NSNumber *number = @1; 字面量数组 NSArray = @[]; @[下标]: //下标访问元素 字面量字典 @{key : value} @[key]; 可变数组与字典 mutArray[1] = ; mutDictionary[key] = ; 注意:用字面量语法创建数组或字典时,若值中有 ni

用字面量对象来做列表

字面量对象是一种数据的传输格式,我们得到一组用数组包含的字面量对象,要怎么运用到动态创建中来呢?比如给我一个字面量对象:做一个显示在线人数的程序,像现在的游戏啊,聊天软件啊,都可以显示在线人数的. 它的主题部分为: 这么多用户,我们一般会用列表形式,如果写静态页面的话,那我们就接着在类名为module重再写,但这种显示人数都是随时变得,一般都会从数据库中随时拿取数据的,所以要写成动态的,其实动态步骤跟静态有相似的,我们先创建ul标签,再创建一个个li,之前我们一般都用document.creat

OC基础:block.字面量

block 块语法,能够用block去保存一段代码,或者封装一段代码. block 实际是由c语言实现的,运行效率非常高. block 实际借鉴了函数指针的语法. block (^)(參数类型1 參数名1,參数类型2 參数名2...); 返回值类型  (^)(); 1.没有參数,括号也不能省略 2.參数名能够省略 void(^myBlock1)();   无參数无返回值 void(^myBlock2)(int a,int b);   有參数无返回值 int(^myBlock3)();    无參