【问题标题】:Assigning `{} + []` to a variable将 `{} + []` 分配给变量
【发布时间】:2014-05-11 06:16:20
【问题描述】:
>> {} + []
0

所以 EmptyObject + EmptyArray 的计算结果为 0。 (免责声明:我不完全理解为什么会这样。)好的,现在我想将这个 0 分配给一个变量!看起来很简单:

>> var a = {} + [];
undefined
>> a
"[object Object]"

好吧,也许没那么容易。 Google 有点...啊哈! {} 在这种情况下is actually a code block,不是一个空对象。所以让我让它看起来更像一个代码块:

>> var a = 
   {

   }
   + [];
undefined
>> a
"[object Object]"

...该死。 自我注意:JavaScript 会忽略空格。


有什么方法可以将{} + [](或类似的)分配给一个变量,但仍然让{} + [] 评估为0?

【问题讨论】:

  • 您为什么要这样做? XD
  • @NiettheDarkAbsol 因为它会很有趣。 :P 我必须有更好的理由吗?
  • {} 在= 之后得到不同的解释。
  • 这让我想起了这颗宝石:destroyallsoftware.com/talks/wat
  • @SergeyK 这实际上是我第一次听说{} + [] = 0

标签: javascript arrays


【解决方案1】:

试试:

var a = eval("{} + []");

console.log(a); // returns (integer) 0

虽然不推荐使用eval方法

【讨论】:

  • 我认为如何在这里并不是最重要的,但为什么才是。
  • 可能是 {} 的长度 + [] 的长度,因为两者都是空的,所以为 0
  • @Huangism 不,它不是用长度计算的,因为如果我们有[2],例如结果将是2
  • @ToKeN 是的,但是 [2] + 2 结果是 22 而不是 4,所以 [2] 必须是一个字符串
  • @Huangism 不,eval("{} + [2] + 2"); 给4
【解决方案2】:

不,没有办法将确切的代码分配给变量并将其计算为 0,因为对给出 0 的代码的解析并不构成表达式†,只能分配表达式。你得到 0 的原因是因为大括号基本上被忽略为空语句,然后你得到表达式 + [] 的结果(即,一元 + 运算符应用于空数组)。因此,为了得到相同的结果,您需要更改表达式,使其刚好可以得到+[]。例如,您可以使用var a = ({}, + []),这会给您正确的答案(因为逗号会导致单独评估+ [])。

† 这也是当您尝试分配它时它给出不同答案的原因。这会强制将代码解析为表达式,因此{} 不再是空块,+ 不再是一元 +,而是带有空对象和空数组作为操作数的二进制加.

【讨论】:

  • 我向你鞠躬,伟大的 Javascript 之神!
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多