为什么在Javascript中,`({}+{}+{}*2.length`返回33?

为什么在Javascript中,`({}+{}+{}*2.length`返回33?,javascript,Javascript,在Javascript中,{}+{}.length返回30,而{}+{}+{}+{}*2.length返回33。我希望对这种行为能有一个通俗易懂的教学解释 常数a={}+{}; 常数b={}+{}+{}*2; log'{}+{}=',a,a.length; log'{}+{}+{}*2=',b,b.length +将连接两个操作数的字符串版本。所以{}+{}将{}两边变成一个字符串,并将它们连接在一起。您可以将[object object]与[object object]连接起来,后者的长度为

在Javascript中,{}+{}.length返回30,而{}+{}+{}+{}*2.length返回33。我希望对这种行为能有一个通俗易懂的教学解释

常数a={}+{}; 常数b={}+{}+{}*2; log'{}+{}=',a,a.length; log'{}+{}+{}*2=',b,b.length +将连接两个操作数的字符串版本。所以{}+{}将{}两边变成一个字符串,并将它们连接在一起。您可以将[object object]与[object object]连接起来,后者的长度为30个字符

+从左到右操作,*具有更高的运算符优先级。所以

({}+{}+{}*2).length
相当于:

({}+{}+{}*2).length
({}+{}+({}*2)).length
(({}+{})+({}*2)).length
(({}+{}                           )+({}*2)).length // same as above, but spaced out
(('[object Object][object Object]')+({}*2)).length
{}*2试图将无法有意义地转换为数字的某个数字相乘,因此结果为NaN:

(('[object Object][object Object]')+({}*2)).length
(('[object Object][object Object]')+(NaN )).length
('[object Object][object Object]' + NaN).length
+将在任一侧为字符串时连接,因此您可以得到:

'[object Object][object Object]NaN'.length

它是33。

{}+{}以字符串形式返回[object object][object object object],add.length返回30,因为[object object object][object object]。但是{}*2是NaN这给了我们{}+{}+{}*2=>{}+{}+NaN=>[object object][object]NaN,它的字符串长度是33