Разница в {} + []
в том, что, когда вы делаете задание он обрабатывается в контексте выражения, но когда вы вводите его сам по себе он обрабатывается как заявление
var b = /*an expression*/
Это различие видно при использовании анонимного функции
//expression
var f = function(){}; //allowed
//statement
function(){}; //not allowed. function statements need a name.
Таким образом, в контексте выражения, мы добавим {}
(пустой объект) и []
(пустой список) с binary +
operator. Из-за type conversion rules, {}
преобразуется в строку "[object Object]", а []
преобразуется в empty string, конкатенацией которого является «[объект объекта]».
//parenthesis force an expression
({} + "hello") //"[object Object]hello"
({} + []) //"[object Object]"
({} + [1]) //"[object Object]1"
({} + [1,2]) //"[object Object]1,2"
В то же время, когда мы убираем скобки, то {}
обрабатывается как пустой блок инструкций. В практических целях он работает так, как если бы мы полностью его совершили, оставив unary +
operator, чтобы действовать в списке. Это преобразует его в число.
+[] // 0
{} + [] // 0
+{} // NaN
{} + {} // NaN
{} +"17"// 17
Хотя это может показаться странным, чтобы иметь возможность получить значение от оператора (вместо только из выражений), стандартный Javascript, делаетspecify значение для утверждения. В нашем случае наша программа представляет собой список из двух исходных элементов, номер value is given by - последний оператор, expression statement.
Путь, чтобы увидеть значение завершения заявление в действии через Eval:
eval("{}") //undefined
eval("1") //1
eval("1;2") //2
это лишь нюанс там нет никаких причин для дизайна этого –