Javascript ES6标记的模板函数如何解释其参数顺序?

Javascript ES6标记的模板函数如何解释其参数顺序?,javascript,ecmascript-6,template-strings,Javascript,Ecmascript 6,Template Strings,考虑以下代码: function f() { console.log(Array.from(arguments)); } var x = 2; var y = 3; f`before ${x} ${y} after`; f的参数是(): 假设我想用替换值连接所有文字字符串。 我该如何按照正确的顺序进行操作 我是否需要将第一个数组中的“分割点”与第一个数组后的每个参数相匹配?根据ECMAScript 6规范草案的wiki,它更复杂,因为模板考虑了转义序列: 模板 德苏格会去吗 因此,参数

考虑以下代码:

function f() {
  console.log(Array.from(arguments));
}

var x = 2;
var y = 3;
f`before ${x} ${y} after`;
f
的参数是():

假设我想用替换值连接所有文字字符串。
我该如何按照正确的顺序进行操作


我是否需要将第一个数组中的“分割点”与第一个数组后的每个参数相匹配?

根据ECMAScript 6规范草案的wiki,它更复杂,因为模板考虑了转义序列:

模板

德苏格会去吗

因此,
参数
应该包含您在traceur中看到的替换值,但文字部分是对象而不是数组

如果您想为使用traceur编译的代码实现它,可以执行以下未优化示例中的操作

let concatenated = "";
Array.forEach(args[0], (e, i) =>
    concatenated += e + ( i < arguments.length - 1 ? arguments[i+1] : "")
);
let concatenated=“”;
Array.forEach(args[0],(e,i)=>
串联+=e+(i

对于真正的ECMAScript 6代码,请查看实现,正如bergi在评论中所建议的那样。

根据ECMAScript 6规范草案的wiki,它更复杂,因为模板考虑了转义序列:

模板

德苏格会去吗

因此,
参数
应该包含您在traceur中看到的替换值,但文字部分是对象而不是数组

如果您想为使用traceur编译的代码实现它,可以执行以下未优化示例中的操作

let concatenated = "";
Array.forEach(args[0], (e, i) =>
    concatenated += e + ( i < arguments.length - 1 ? arguments[i+1] : "")
);
let concatenated=“”;
Array.forEach(args[0],(e,i)=>
串联+=e+(i

对于真正的ECMAScript 6代码,请看一下实现,正如bergi在评论中所建议的那样。

总是比替换多一个文字部分。第一个文本是模板的第一部分(如果以替换开头,则为空字符串),最后一个文本是模板字符串的尾部(如果以替换结尾,则为空字符串)

要按顺序获取零件,请访问
literal[0]
sub[0]
literal[1]
,…,
sub[sub.length-1]
literal[sub.length]

这里有一个简单的起点:

function simpleTag(lit, ...sub) {
  return sub.reduce(
    // Add next substition and following literal
    (soFar, s, i) => soFar + s + lit[i+1],
    lit[0] // Start with the first literal
  );
}

总有一个比替换多的文字部分。第一个文本是模板的第一部分(如果以替换开头,则为空字符串),最后一个文本是模板字符串的尾部(如果以替换结尾,则为空字符串)

要按顺序获取零件,请访问
literal[0]
sub[0]
literal[1]
,…,
sub[sub.length-1]
literal[sub.length]

这里有一个简单的起点:

function simpleTag(lit, ...sub) {
  return sub.reduce(
    // Add next substition and following literal
    (soFar, s, i) => soFar + s + lit[i+1],
    lit[0] // Start with the first literal
  );
}

看起来是这样。如果查看AST,模板字符串被“划分”为三个类和两个表达式(至少esprima这样做)。谦逊的自我提升:让你检查AST。这不正是已经做的吗?看起来是这样的。如果查看AST,模板字符串被“划分”为三个类和两个表达式(至少esprima这样做)。谦逊的自我提升:让你检查AST。这不正是已经做的吗?谢谢!那是最新版本吗?目前我看到了三个版本:1)草稿规范定义(对象带有
raw
/
cooked
),2)草稿规范默认准标记(使用一些名为
expandedLP
的属性),以及3)traceur实现(“cooked”数组带有
raw
属性)。生/熟物品(1)是最终的吗?@AndreyShchekin我能找到的最新草稿是2014-07-18。在12.2.9模板文本中,它们使用原始/熟对象(1)变体。看起来他们已经放弃了准文本的名称,并将整个内容重命名为模板文本。它仍然是一个草稿,所以没有人能确定它是否会是最终版本。谢谢!那是最新版本吗?目前我看到了三个版本:1)草稿规范定义(对象带有
raw
/
cooked
),2)草稿规范默认准标记(使用一些名为
expandedLP
的属性),以及3)traceur实现(“cooked”数组带有
raw
属性)。生/熟物品(1)是最终的吗?@AndreyShchekin我能找到的最新草稿是2014-07-18。在12.2.9模板文本中,它们使用原始/熟对象(1)变体。看起来他们已经放弃了准文本的名称,并将整个内容重命名为模板文本。它仍然是一个草案,所以没有人能确定它是否会是最终版本。
function simpleTag(lit, ...sub) {
  return sub.reduce(
    // Add next substition and following literal
    (soFar, s, i) => soFar + s + lit[i+1],
    lit[0] // Start with the first literal
  );
}