Javascript Es6 标记模板 - 何时使用原始?什么时候用熟?

dma*_*man 5 javascript ecmascript-6 template-literals tagged-templates

在学习了这个 Es6 标签模板示例之后:

var yo = func`${x} + ${y}\n= ${x + y}`;
Run Code Online (Sandbox Code Playgroud)
one@public-node ~/es6 $ 6to5 tag.js 
"use strict";

var _taggedTemplateLiteral = function (strings, raw) {
  return Object.freeze(Object.defineProperties(strings, {
    raw: {
      value: Object.freeze(raw)
    }
  }));
};

var yo = func(_taggedTemplateLiteral(["", " + ", "\n= ", ""], ["", " + ", "\\n= ", ""]), x, y, x + y);
Run Code Online (Sandbox Code Playgroud)

我看到返回的是 var yo = func(strings, raw, x, y, x + y);

我了解有关字符串文字和x y插入值的基础知识。我不明白的是……什么时候使用字符串,什么时候使用原始字符串?由于该函数具有两个数组,并且用户无法控制该函数何时使用 raw 以及何时使用煮熟的(字符串)。

Poi*_*nty 3

标签函数func仅传递一个数组。该数组来自该_taggedTemplateLiteral函数,该函数接受传入的“strings”参数并向其添加一个属性。

该函数func将这样声明(ES5 风格):

function func(strings) {
  var params = [].slice.call(arguments, 1);
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果在内部func,代码需要使用“原始”字符串,它只会访问.raw“strings”变量的属性:

function func(strings) {
  var params = [].slice.call(arguments, 1);

  var raw2 = strings.raw[2];

  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

因此“用户”——标签功能的作者——确实拥有控制权。标签函数中的代码可以随时检查模板部分的原始内容。可能的情况是,本质上实现 DSL 的标记函数可能只想使用原始字符串,而更简单的模板机制不会关心并且很乐意使用“已解析”字符串。

  • 在 ES6 中访问值的正确方法是“func(strings, ...values)” (2认同)