刚在我的浏览器控制台中试过这个:
!!0 //=> false
{} + [] //=> 0
!!({} + []) //=> true
Run Code Online (Sandbox Code Playgroud)
这里发生了什么!?
编辑:我说的是{} + [](对象优先)与[] + {}(数组优先)不同,后者总是返回0.间距({}+[]vs {} + [])似乎并不重要
执行({} + [])生成字符串[object Object],当强制转换为布尔值时,该字符串是真值.
为什么它在用括号括起来时将它视为字符串连接,而在未包装时将其视为数字,我试图找出答案.
更新:我想我已经弄明白了.当代码处于全局级别时,即不作为赋值或作为参数,就会发生这种诡计.可能发生的是它将其解释{}为块而不是对象.
如果您输入{ var x = 4; } +[]控制台,您将得到与之相同的结果{}+[].如果将它放在一组括号中,它会强制编译器将内部解释为表达式,即生成字符串的Object加号Array.
我的猜测是,这种变化部分是由于范围处理的变化所致let.