Javascript Es6 标记模板 - 什么时候使用 raw?什么时候用熟的?
Javascript Es6 Tagged Templates - When is raw used? When is cooked used?
学习了这个 Es6 标签模板示例后:
var yo = func`${x} + ${y}\n= ${x + y}`;
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);
我看到返回的是var yo = func(strings, raw, x, y, x + y);
我了解有关字符串文字和插入的 x
y
值的基础知识。我不明白的是……什么时候使用字符串,什么时候使用原始字符串?由于该函数具有两个数组,并且用户无法控制告诉该函数何时使用 raw 以及何时使用 cooked(strings)。
标签函数func
只传递了一个数组。该数组来自 _taggedTemplateLiteral
函数,该函数接受传入的 "strings" 参数并向其添加一个 属性。
函数 func
将像这样声明(ES5 风格):
function func(strings) {
var params = [].slice.call(arguments, 1);
// do stuff
}
如果在 func
中,代码需要使用 "raw" 字符串,它只会访问 "strings" 变量的 .raw
属性 :
function func(strings) {
var params = [].slice.call(arguments, 1);
var raw2 = strings.raw[2];
// do stuff
}
所以 "user" — 标记函数的作者 — 有控制权。标记函数中的代码可以随时随意检查模板部分的原始内容。本质上实现 DSL 的标记函数可能希望 仅 使用原始字符串,而更简单的模板机制不会关心并且很乐意使用 "parsed" 字符串。
学习了这个 Es6 标签模板示例后:
var yo = func`${x} + ${y}\n= ${x + y}`;
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);
我看到返回的是var yo = func(strings, raw, x, y, x + y);
我了解有关字符串文字和插入的 x
y
值的基础知识。我不明白的是……什么时候使用字符串,什么时候使用原始字符串?由于该函数具有两个数组,并且用户无法控制告诉该函数何时使用 raw 以及何时使用 cooked(strings)。
标签函数func
只传递了一个数组。该数组来自 _taggedTemplateLiteral
函数,该函数接受传入的 "strings" 参数并向其添加一个 属性。
函数 func
将像这样声明(ES5 风格):
function func(strings) {
var params = [].slice.call(arguments, 1);
// do stuff
}
如果在 func
中,代码需要使用 "raw" 字符串,它只会访问 "strings" 变量的 .raw
属性 :
function func(strings) {
var params = [].slice.call(arguments, 1);
var raw2 = strings.raw[2];
// do stuff
}
所以 "user" — 标记函数的作者 — 有控制权。标记函数中的代码可以随时随意检查模板部分的原始内容。本质上实现 DSL 的标记函数可能希望 仅 使用原始字符串,而更简单的模板机制不会关心并且很乐意使用 "parsed" 字符串。