【问题标题】:Inconsistent type for JavaScript ES6 template stringsJavaScript ES6 模板字符串的类型不一致
【发布时间】:2015-08-29 07:25:14
【问题描述】:

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

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

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

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

f(`Hello, World!`)

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

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

f`Hello, World!`

类型变成objectArray [ "Hello, World!" ]输出到控制台。

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

【问题讨论】:

  • 尝试console.log`a ${1} b ${2} c`; 以更好地了解正在发生的事情。通过省略括号,您完全改变了语句的含义:您不再只是简单地调用函数,而是使用了标记模板。是的,这种语法很烂。

标签: javascript ecmascript-6 template-strings


【解决方案1】:
// 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]

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

documentation on MDN can help more

【讨论】:

  • 来自 36k 代表用户,我希望在列表中列出规范的链接。有点失望。
  • 感谢您的帮助!正如我从@Blackhole 的评论中了解到的那样,我建议进行编辑以添加此语法称为标记模板字符串,以帮助未来的搜索者。这个答案很有帮助且内容丰富。
  • @UndefinedFunction:它被称为“标记模板”(没有“字符串”)。我认为调用“字符串”(官方称它们为“标记模板”和“模板文字”)有点误导,特别是因为标记模板根本不一定会产生字符串。
  • @FelixKling 嗯,很有趣。 MDN 说“标记的模板字符串”,所以这就是我这么称呼它们的原因。
  • @UndefinedFunction:是的。我对此并不特别高兴;)ecma-international.org/ecma-262/6.0/…
猜你喜欢
  • 2016-09-19
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2017-10-03
  • 1970-01-01
相关资源
最近更新 更多