将`{} + []`赋值给一个变量

12
>> {} + []
0
所以 EmptyObject + EmptyArray 的结果是 0。(免责声明:我不完全理解这为什么。)好的,现在我想将这个 0 赋值给一个变量!看起来很简单:
>> var a = {} + [];
undefined
>> a
"[object Object]"

好吧,也许并不是那么简单。谷歌一下...啊哈!在这种情况下,{}实际上是一个代码块而不是空对象。所以让我把它看起来更像一个代码块:

>> var a = 
   {

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

...当。 自己注意:JavaScript忽略空格。


有没有办法将{} + [](或类似的)赋值给一个变量,但仍使得{} + []计算结果为0


10
为什么你想要这样做呢?XD - Niet the Dark Absol
2
@NiettheDarkAbsol 因为这样很有趣。:P 我需要更好的理由吗? - The Guy with The Hat
在编程中,= 后面的 {} 会被解释成不同的意思。 - Kevin B
@SergeyK,那其实是我第一次听说{} + [] = 0的地方。 - The Guy with The Hat
可能是为什么空数组类型转换为零? + []的重复问题。 - Huangism
显示剩余3条评论
2个回答

11
不,没有办法将那个精确的代码赋给一个变量并得到0,因为解析该代码以给出0的操作不构成表达式†,只有表达式才能被分配。你得到那个0的原因是花括号被实质上忽略为一个空语句,然后你得到了表达式+ [](也就是将一元+运算符应用于空数组)。因此,为了得到相同的结果,你需要修改表达式,使其仅计算出+[]。例如,你可以这样做:var a = ({}, + []),这将给你正确的答案(因为逗号会导致+ []被单独评估)。
†这也是当你尝试分配它时它会给出不同答案的原因。这迫使代码被解析为表达式,因此{}不再是空块,+也不再是一元+,而是带有空对象和空数组作为操作数的二进制加号。

1
我向你俯首称臣,伟大的JavaScript之神! - Randy L

3

尝试:

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

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

虽然不推荐使用eval方法


3
我认为这里最重要的不是“如何”,而是“为什么”。 - DontVoteMeDown
可能是 {} 和 [] 的长度之和,因为它们都为空,所以结果为0。 - Huangism
@Huangism 不是通过长度计算的,因为如果我们有 [2],结果将是 2 - nanobash
@ToKeN 是的,但是[2] + 2的结果是22而不是4,所以[2]必须是一个字符串。 - Huangism
即使没有 eval{} + [2] + 2 的结果是 4。这是因为它被视为 +[2] + 2,而 +[2] 的值为 2。然而,[2] + 2 是不同的,它的结果是 22,因为在这种情况下 [2] 被视为 "2" - Tim Goodman
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接