在Chrome JavaScript控制台中,为什么将括号括起来的语句{} - 0
更改返回的值?{} - 0 JavaScript中的VS({} - 0)
{} - 0 // Returns -0
({} - 0) // Returns NaN
在圆括号中包装单个语句会改变包含的值,这似乎令人难以置信的奇怪。我在这里错过了什么?
在Chrome JavaScript控制台中,为什么将括号括起来的语句{} - 0
更改返回的值?{} - 0 JavaScript中的VS({} - 0)
{} - 0 // Returns -0
({} - 0) // Returns NaN
在圆括号中包装单个语句会改变包含的值,这似乎令人难以置信的奇怪。我在这里错过了什么?
有线{} - 0
的两种可能的解释:
{}; -0
,其中{}
被解释为空块语句,并且-
是一元否定运算符(因此-0
只是“负零”)。评估时的值是最后一条语句的值,即-0。({} - 0)
,其中{}
被解释为一个空的对象,并-
是减法运算符(所以0
从{}
减去)。在您的第一行中,这是不明确的,所以它会选择第一个解释。在第二行中,第一个解释是无效的(因为块声明永远不能成为表达式的一部分,这是你用强调的方式强制的)。
这是一个非常有趣的问题。不是OP,但我对此有了一个后续:如果通过添加方法或属性强制将该{}解释为对象,会怎么样?这适用于括号,但并非没有。 (例如带括号的表达式被评估为'3':'({valueOf:()=> 3} - 0)',但没有,它仍然在控制台中返回'-0':'{valueOf :() => 3} - 0')。不应该添加的方法强迫它将'{..}'解释为此时的对象,然后尝试将其评估为减法? –
@JosephMarikle我认为同样的推理在这里仍然适用,没有parens,它仍然可以解释为'{valueOf:()=> 3}; -0'然而'({valueOf:()=> 3}; -0)'是一个语法错误。 –
@JosephMarikle你会这样想,但不:在这种情况下,'valueOf:'是一个[标签语句](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label )(一种罕见的JavaScript特性),在语句'()=> 3;'之前,所以它仍然被解释为一个块语句而不是一个对象。它的解释方式与'{valueOf:()=> 3; }; -0'。 – Frxstrem
{} - 0
:这里{}
只是一个空白的块,什么都不做,所以-0
由控制台返回。
({} - 0)
:这里{}
是表达式的一部分,并被转换为数字。在该空对象中没有定义valueOf()
方法,并且在转换为数字时,它会回到toString()
方法,该方法返回类似object Object
的{}
。然后该字符串object Object
正在转换为一个数字,并给出NaN
,因为它实际上不是一个数字。所以,我们有
({} - 1)
- >('object Object' - 1)
- >(NaN - 1)
的一切与NaN
给NaN
。这就是你终于在控制台中看到的。
{} - 0
被解释:{} empty block statement
和- 0 negative zero
({} - 0)
所有内部()
被解释为表达,empty object - 0 = NaN
好问题,当然还有别人比我知道得多。我猜想它与你将它包装在paranthesis中的事实有关,这使得它成为一个可执行的函数? – jdmdevdotnet
https://www.destroyallsoftware.com/talks/wat –
看起来像一个空的块,vs空对象 – epascarello