2012-01-26 5 views
3

Каковы значения [] + [], [] + {}, {} + [], {} + {}? И как?Что такое [] + [] в javascript

Это мой журнал консоли

>{} + {} 
>NaN 
>[] + [] 
>'' 
>{} + [] 
>0 
>[] + {} 
>[Object object] 

Также

>var a = [] + {} 
>a 
>[Object object] 
>var b = {} + [] 
>b 
>[Object object] 

Как же изменение значения на уступки?

SRC: video

+1

это лишь нюанс там нет никаких причин для дизайна этого –

ответ

10

Разница в {} + [] в том, что, когда вы делаете задание он обрабатывается в контексте выражения, но когда вы вводите его сам по себе он обрабатывается как заявление

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 
4

В + оператор concats строки. Поэтому он пытается преобразовать объекты и массивы в строки.

{} преобразует в '[Object object]' и [] преобразует в ''.

EDIT: Я не могу объяснить, почему {} + [] является 0 и почему ({}) + [] является "[object Object]".

+4

'{} + []' Я думаю, что '{}' интерпретируется как пустой оператор блока, поэтому '+' интерпретируется как * унарная * версия, и поэтому вы остаетесь с '+ []', что делает преобразование * toNumber * массива * (путем преобразования toString) *. –

+1

am правильно; например '{alert (1)}' будет предупреждать, а не бросать 'missing:' –