可以使用字符串作为第一个操作数的加法运算符返回非字符串吗?

时间:2017-08-11 15:33:51

标签: javascript flowtype

Flow v0.52.0可以使用:

"" + ""
"" + 0

但是not ok with

"" + null
"" + undefined
"" + true
"" + {}

AFAIK,使用带字符串作为第一个操作数的加法运算符将始终返回一个字符串。事实上,这就是Babel用于template literal transpilation的内容:

`${true}${false}` === "" + true + false

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

Flow不允许大多数隐式类型转换。允许使用"" + 0,因为这是将数字转换为字符串的常用方法,但基本上从未出现过将nullundefined或任何其他类型转换为字符串的情况隐式。

  

实际上,这是Babel用于模板文字转换的内容

Babel的默认目标是在性能和​​规范合规性之间划一条线。如果你看the spec: true option,你就会看到

`${true}${false}`

相当于

"".concat(true, false) // Babel 7.x

其中.concat用于使用.valueOf语义将值隐式转换为字符串。

Babel 6使用的是较长版本,其中包含无关的订购问题:

'' + String(true) + '' + String(false) + '' // 6.x

String()函数明确说明"将其转换为字符串"。

当你使用模板文字语法时,你要求它被字符串化,而原始的'' + true情况却没有,这是有道理的,因为模板文字是一个明确的声明"我想要一个string",而+运算符要求连接,并且大部分时间都不需要隐式转换。