在测试
JavaScript ES6的新模板字符串时(在Firefox中,如果它很重要),我注意到它们的类型有些不一致.
我定义了一个自定义函数,如下所示:
function f(a) { console.log(typeof(a)); console.log(a); }
首先,我使用模板字符串周围的括号测试了“正常”功能.
f(`Hello,World!`)
正如预期的那样,这产生了一种字符串和Hello,World!被输出到控制台.
f`Hello,World!`
类型变成了对象,而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`one${2}three${4}five`
将通过f
f(strings,...values)
同
strings // ['one','three','five']
这是模板的所有字符串部分的列表,以及
values // [2,4]
这是字符串之间的所有值.这允许标签预处理字符串并对其进行处理.