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

Bea*_*qua 0 javascript

在 Javascript 中,({}+{}).length返回 30 而({}+{}+{}*2).length返回 33。我希望对这种行为进行可访问的教学解释。

const a = {}+{};
const b = {}+{}+{}*2;

console.log('({}+{}) =', a, a.length);
console.log('({}+{}+{}*2) =', b, b.length);
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 6

+,当任一操作数不是数字时,将连接两个操作数的字符串版本。so{}+{}会变成{}两边的字符串,并将它们连接在一起。您将[object Object]连接[object Object]30 个字符长的 。

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

({}+{}+{}*2).length
Run Code Online (Sandbox Code Playgroud)

相当于:

({}+{}+{}*2).length
({}+{}+({}*2)).length
(({}+{})+({}*2)).length
(({}+{}                           )+({}*2)).length // same as above, but spaced out
(('[object Object][object Object]')+({}*2)).length
Run Code Online (Sandbox Code Playgroud)

{} * 2到乘法东西尝试不能有意义地转换为数字,因此NaN是结果:

(('[object Object][object Object]')+({}*2)).length
(('[object Object][object Object]')+(NaN )).length
('[object Object][object Object]' + NaN).length
Run Code Online (Sandbox Code Playgroud)

+ 当任一侧是字符串时将连接,所以你得到:

'[object Object][object Object]NaN'.length
Run Code Online (Sandbox Code Playgroud)

这是 33。