2012-01-26 4 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. 

だから表現コンテキストで、我々は{}(空のオブジェクト)とを追加します0(空リスト)に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文の値を行います。私たちの場合、私たちのプログラムは2つのソース要素のリストです。value is given by最後の文はexpression statementです。

アクションでステートメント完了値を参照する方法はevalを経由している:それらはちょうど警告されている

eval("{}") //undefined 
eval("1") //1 
eval("1;2") //2 
4

+オペレータconcats文字列。したがって、オブジェクトと配列を文字列に変換しようとします。

{}は、'[Object object]'に変換され、[]は、''に変換されます。

編集:なぜ{} + []0であり、なぜが"[object Object]"であるのか説明できません。

+4

'{} + []'私は推測したいのための任意の設計上の理由'{}'は空のブロック文として解釈されるので、 '+'は*単項バージョン*として解釈されるので、配列の* toNumber *変換を行う '+ []' *(toString変換による)*。 –

+1

amは正しいです。例えば'{alert(1)}'は 'missing:'を投げるのではなく、警告を出します。 –