7

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

我定义了一个自定义函数,如下所示:

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

首先,我在模板字符串周围使用括号“正常”地测试了该函数。

f(`Hello, World!`)

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

然后我调用了函数简写,没有括号,并且出现了不一致。

f`Hello, World!`

类型变为object,并Array [ "Hello, World!" ]输出到控制台。

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

4

1 回答 1

2
// 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`one${2}three${4}five`

会通过f

f(strings, ...values)

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

这是模板的所有字符串部分的列表,以及

values
// [2, 4]

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

MDN 上的文档可以提供更多帮助。

于 2015-08-28T20:58:07.987 回答