2017-08-11 49 views
17

在Chrome JavaScript控制台中,为什么将括号括起来的语句{} - 0更改返回的值?{} - 0 JavaScript中的VS({} - 0)

{} - 0 // Returns -0 
({} - 0) // Returns NaN 

在圆括号中包装单个语句会改变包含的值,这似乎令人难以置信的奇怪。我在这里错过了什么?

+0

好问题,当然还有别人比我知道得多。我猜想它与你将它包装在paranthesis中的事实有关,这使得它成为一个可执行的函数? – jdmdevdotnet

+2

https://www.destroyallsoftware.com/talks/wat –

+1

看起来像一个空的块,vs空对象 – epascarello

回答

19

有线{} - 0的两种可能的解释:

  1. 它可以被解释为{}; -0,其中{}被解释为空块语句,并且-是一元否定运算符(因此-0只是“负零”)。评估时的值是最后一条语句的值,即-0。
  2. 它可以解释为({} - 0),其中{}被解释为一个空的对象,并-是减法运算符(所以0{}减去)。

在您的第一行中,这是不明确的,所以它会选择第一个解释。在第二行中,第一个解释是无效的(因为块声明永远不能成为表达式的一部分,这是你用强调的方式强制的)。

+4

这是一个非常有趣的问题。不是OP,但我对此有了一个后续:如果通过添加方法或属性强制将该{}解释为对象,会怎么样?这适用于括号,但并非没有。 (例如带括号的表达式被评估为'3':'({valueOf:()=> 3} - 0)',但没有,它仍然在控制台中返回'-0':'{valueOf :() => 3} - 0')。不应该添加的方法强迫它将'{..}'解释为此时的对象,然后尝试将其评估为减法? –

+0

@JosephMarikle我认为同样的推理在这里仍然适用,没有parens,它仍然可以解释为'{valueOf:()=> 3}; -0'然而'({valueOf:()=> 3}; -0)'是一个语法错误。 –

+6

@JosephMarikle你会这样想,但不:在这种情况下,'valueOf:'是一个[标签语句](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label )(一种罕见的JavaScript特性),在语句'()=> 3;'之前,所以它仍然被解释为一个块语句而不是一个对象。它的解释方式与'{valueOf:()=> 3; }; -0'。 – Frxstrem

4

{} - 0:这里{}只是一个空白的块,什么都不做,所以-0由控制台返回。

({} - 0):这里{}是表达式的一部分,并被转换为数字。在该空对象中没有定义valueOf()方法,并且在转换为数字时,它会回到toString()方法,该方法返回类似object Object{}。然后该字符串object Object正在转换为一个数字,并给出NaN,因为它实际上不是一个数字。所以,我们有

({} - 1) - >('object Object' - 1) - >(NaN - 1)

的一切与NaNNaN。这就是你终于在控制台中看到的。

2
{} - 0 

被解释:{} empty block statement- 0 negative zero

({} - 0) 

所有内部()被解释为表达,empty object - 0 = NaN

相关问题