JavaScript ES6 模板字符串的类型不一致

Inconsistent type for JavaScript ES6 template strings

在测试 JavaScript ES6 的新模板字符串时(在 Firefox 中,如果它重要的话),我注意到它们的类型有些不一致。

我定义了一个自定义函数,像这样:

function f(a) {
    console.log(typeof(a));
    console.log(a);
}

首先,我测试了函数 "normally",在模板字符串两边使用括号。

f(`Hello, World!`)

正如预期的那样,这产生了一种类型 string 并且 Hello, World! 被输出到控制台。

然后我调用函数shorthand,没有括号,结果出现了不一致。

f`Hello, World!`

类型变成了object,并且Array [ "Hello, World!" ]输出到了控制台

为什么使用第二种方法时模板字符串被包裹在一个数组中?这只是 Firefox 中的一个错误(毕竟 ES6 一个新标准)还是出于某种原因这种行为是预期的?

// A function call, passed the result of a template literal.
f(`str`)

// A tagged template call, passed metadata about a template.
f`str`

不一样。第一个以单个字符串作为参数调用 f。第二个调用 f 带有多个参数,具体取决于模板。例如

f`onethreefive`

会通过 f

f(strings, ...values)

strings
// ['one', 'three', 'five']

这是模板所有字符串部分的列表,并且

values
// [2, 4]

这是适合字符串之间的所有值。这允许标签预处理字符串并对其进行处理。

documentation on MDN can help more.