模板字面量标签函数

模板字面量

ES6新增了使用模板字面量定义字符串的能力,保留换行字符,保持反引号内部的空格。

模板字面量在定义模板时特别有用。

let htmlContent=`<div>......</div>`;

字符串插值

模板字面量最常用的一个特性是支持字符串插值。

技术上讲,模板字面量不是字符串,而是一种特殊的JavaScript句法表达式,只不过求值后得到的是字符串。模板字面量在定义时立即求值并转换为字符串实例。

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

所有插入的值都会通过toString()强制转型为字符串。

嵌套的模板字面量无须转义:

console.log(`hello ${`world`}`);

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

let foo = { toString: () => `world` };

console.log(`hello ${foo}`);

插值表达式可以调用函数:

function capitalize(word) {

  return `${word[0].toUpperCase()}${word.slice(1)}`;

}

console.log(`${capitalize("hello")} ${capitalize("world")}`);

模板字面量标签函数

模板字面量支持定义标签函数,通过标签函数可以自定义插值行为。

标签函数会接收被插值记号分隔后的模板和对每个表达式求值的结果。

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

//模板字面量标签函数
let a = 6;
let b = 9;
let c = 10;
//标签函数接收到的参数依次是原始字符串数组和对每个表达式求值的结果。
//函数返回对模板字面量求值得到的字符串。
//strings被插值记号分隔后的模板。
function simpleTag(strings, aValExpression, bValExpression, sumExpression) {
  console.log(strings); //[ "", " + ", " = ", "" ]
  console.log(aValExpression); //6
  console.log(bValExpression); //9
  console.log(sumExpression); //15

  return "foobar";
}

let untaggedResule = `${a} + ${b} = ${a + b}`;
var taggedResule = simpleTag`${a} + ${b} = ${a + b}`;

console.log(untaggedResule); //"6+9=15"
console.log(taggedResule); //"foobar"

//使用剩余操作符(...),以数组形式存储数量可变的表达式参数。
function restSimpleTag(strings, ...expressions) {
  console.log(strings); //[ "", " + ", " = ", "" ]
  console.log(expressions); //[6, 9, 15]
  for (const expression of expressions) {
    console.log(expression);
  }
  return "foobar";
}

var taggedResule = restSimpleTag`${a} + ${b} = ${a + b}`;
console.log(taggedResule); //"foobar"

//对于有n个插值的模板字面量,模板字面量标签函数接收到的表达式参数始终是n个,第一个参数所包含的字符串个数为n+1。
//拼接字符串
function joinTag(strings, ...expressions) {
  console.log(strings); //[ "", " + "," + ", " = ", "" ]
  console.log(expressions); //[6, 9, 10, 25]
  let result = "";
  for (let i = 0; i < expressions.length; i++) {
    result += strings[i];
    result += expressions[i];
  }
  //console.log(strings.length); //5
  //console.log(strings[strings.length - 1]); //""
  result += strings[strings.length - 1];
  return result;
}
var taggedResule = joinTag`${a} + ${b} + ${c} = ${a + b + c}`;
console.log(taggedResule); //"6 + 9 + 10 = 25"

function zipTag(strings, ...expressions) {
  return (
    strings[0] +
    expressions
      .map((expression, i) => {
        return `${expression}${strings[i + 1]}`;
      })
      .join("")
  );
}
var taggedResule = zipTag`${a} + ${b} = ${a + b}`;
console.log(taggedResule); //"6 + 9 = 15"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Irene1991

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值