一篇文章带你看懂JavaScript中的模板字面量

简介: 一篇文章带你看懂JavaScript中的模板字面量

模板字面量


ECMAScript 6新增了使用木板子面了定义字符串的能力。与使用单引号或双引号不同,模板字面量保留换行字符,可以跨行定义字符串

<script>
    let myMultiLineString = 'first line\nsecond line';
    let myMultiLineTemplateLiteral = 'first line second line';
    console.log(myMultiLineString);
    // first line
    // second line
    console.log(myMultiLineTemplateLiteral);
    // first line  second line
</script>

顾名思义,模板字面量在定义模板时特别游泳,比如下面这个HTML模板

<div>
    <a href="#">
        <span>Jake</span>
    </a>
</div>

由于木板子会保持反引号内部的空格,因此在使用时需要格外注意。格式正确的模板字符串看起来可能会缩进不当

<script>
    let myTemplateLiteral = 'first line second line';
    console.log(myTemplateLiteral.length);   // 47
    let secondTemplateLiteral = 'first line second line';
    console.log(secondTemplateLiteral[0] === '\n');   // true
    let thirdTemplateLiteral = 'first line second line';
    console.log(thirdTemplateLiteral);   // first line second line
</script>


字符串插值


模板字面量最常用的一个特性是支持字符串插值,也就是可以在一个连续定义中插入一个或多个值。技术上将,模板字面量不是字符串,而是一种特殊的JavaScript句法表达式,只不过求值后得到的是字符串,模板字面量在定义时立即求值并转换为字符串实例,任何插入的变量也会从它们最接近的作用域中取值

字符串插值通过${}中使用一个JavaScript表达式实现

<script>
  let value = 5 ;
  let exponent = 'second';
  let interpolatedString = value + 'to the ' + exponent + ' power is ' + (value * value);
  let interpolatedTemplateLiteral = '${ value } to the ${ exponent } power is ${ value * value }';
  console.log(interpolatedString);
  console.log(interpolatedTemplateLiteral);
</script>

所有插入的值都会使用toString()强制转型为字符串,而且任何JavaScript表达式都可以用于插值。嵌套的模板字符串无须转义

console.log('Hello,${'World' }!'); //Hello,World!

将表达式转换为字符串会调用toString()

let foo = {toString: () => 'World'};
console.log('Hello,${ foo }!');   // Hello ,World!

此外,模板也可以插入自己之前的值

<script>
    let value = '';
    function append() {
        value = '${value}abc'
        console.log(value);
    }
    append();  // abc
    append();  // abcabc
    append();  // abcabcabc
</script>


模板字面量标签函数


模板字面量也支持定义标签函数,而通过标签函数可以自定义插值行为。标签函数会接收被插值符号分隔后的模板和对每个表达式求值的结果

标签函数本身是一个常规函数,通过前缀到模板字面量来应用自定义行为

<script>  
  let a = 6 ;  
  let b = 9 ;  
  function simpleTag(strings , aValExpression , bValExpression , sumExpression) {  
    console.log(strings);  
  console.log(aValExpression);  
  console.log(bValExpression);  
  console.log(sumExpression);  
  return 'foobar';  
  }  
    let untaggedResult = '${ a } + $ { b }  = ${ a + b }';  
</script>

因为表达式参数的数量是可变的,所以通常使用剩余操作符(rest operator)将它们收集到一个数组中

let a = 6 ;
let b = 9 ;

对于有n个插值的模板字面量,传给标签函数的表达式参数的个数始终是n,而传给标签函数的第一个参数所包含的字符串的个数始终是n+1。因此,如果你想把这些字符串和对表达式求值的结果拼接起来作为默认返回的字符串,可以这么做

<script>
let a = 6 ;
let b = 9 ;
        function zipTag(String, ...expressions) {
            return strings[0] +
                expressions.map((e, i) => '${e}${strings[i+1]}').join('');
        }
        let untaggedResult = '${ a } + ${ b } = ${ a + b }';
        let taggedResult = zipTag`${a} + ${b} = ${a + b}`;
        console.log(untaggedResult);
        console.log(taggedResult);
    </script>


相关文章
|
2月前
|
JavaScript 前端开发
JavaScript中的正则表达式构造函数和正则表达式字面量
JavaScript中的正则表达式构造函数和正则表达式字面量
|
5月前
|
JavaScript 前端开发 开发者
Vue.js模板语法[下](事件处理,表单综合案例,自定义组件)---详细讲解
Vue.js模板语法[下](事件处理,表单综合案例,自定义组件)---详细讲解
36 0
|
5月前
|
缓存 JavaScript 前端开发
Vue.js入门模板语法[上] 及Vue.js实现购物车---详细讲解
Vue.js入门模板语法[上] 及Vue.js实现购物车---详细讲解
31 0
|
1月前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
18 6
|
4月前
HTML+CSS+JS实现十款好看的登录注册界面模板,赶紧收藏起来吧!(一)
HTML+CSS+JS实现十款好看的登录注册界面模板,赶紧收藏起来吧!
|
1月前
|
自然语言处理 JavaScript 前端开发
Vue.js 深度解析:模板编译原理与过程
Vue.js 深度解析:模板编译原理与过程
|
6月前
|
JavaScript 前端开发
12Vue - 模板语法(插值-使用JavaScript表达式)
12Vue - 模板语法(插值-使用JavaScript表达式)
19 0
|
2月前
|
JSON 前端开发 JavaScript
【网络安全必备 | 前端开发基础】一篇文章速学 JavaScript
【网络安全必备 | 前端开发基础】一篇文章速学 JavaScript
53 0
|
2月前
|
JavaScript
「为什么代码要整洁?」——代码整洁度对于项目质量的影响,让我们通过这边文章来教你js和ts的代码整洁技巧,让你的项目更出众(上)
代码质量与整洁度成正比。有的团队在赶工期的时候,不注重代码的整洁,代码写的越来越糟糕,项目越来越混乱,生产力也跟着下降,那就必须找更多人来提高生产力,开发成本越来越高。