2016-12-13 3 views
27

JSコンソールを開いて[] + {} === {} + []と入力すると、それが正しいことがわかります。[] + {} === {} + []はなぜ本当ですか?

これはなぜわかりません。私はそれがどのように解析されているかを調べようとしました。

[] + {}については、+は加算演算子です。これは、被演算子が両方のリテラルであるためです。 LHSが.valueOf()を通して数が得られないので、それは私たち""{}空コードブロックであり、「無視」さ{} + []について+ "[object Object]"

を与える両方のオペランドに.toString()を使用して文字列の連結を行い、+オペレータはこことして解析され単項プラス演算子では、そのオペランドを数値に変換します。数字に変換された空の配列0

これは確かに間違っているはずです"[object Object]" === 0が表示されますか?

ID演算子は、2つのオペランドが型変換なしで等しいかどうかをチェックします。これがどうして真実になるのか分かりません。話のどの部分が欠落していますか?

編集:私はあなたが({} + [])を入力した場合、それはRHSに等しい「[オブジェクトのオブジェクト]」を作り、空のオブジェクトとしてそれを解析して表示さ

。私はこれを見て、()はグループ化演算子です。だからおそらくこれはこれと関係がありますか?

これはWhat is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?の複製ではありません。答え箇条書き1 === 2は真実であってはならない。

+5

http://stackoverflow.com/questions/9032856/what-is-the-explanation-for-these-bizarre-javascript-behaviours-mentioned-in-the And http://stackoverflow.com/questions/36438034/why-not-no-longer-nan-in-chrome-console – epascarello

+0

空のオブジェクトパラメータはオブジェクトコンストラクタも返す== 'true'また空の配列も真を返すコンストラクタオブジェクトです – Dennisrec

+10

' {} 'はできません'==='の直後に来て(そして '[] + {} ==='はそれ自身では有効な文ではないので)空のブロックとして解釈される可能性があります。 – Frxstrem

答えて

38

第二の点in this magnificent answerあなたは、配列やオブジェクトを「一緒に追加」と何が起こるかを説明します。あなたは何を得る

var result = [] + {}; 
 

 
console.log(result); 
 
console.log(typeof result);

引数のそれぞれを文字列に変換されるため、文字列[object Object]です。今度は、空の文字列になり、それに.join()を呼び出すことで結果、その配列のために。それらを一緒に追加する2番目の文字列を離れる - オブジェクトの場合、それは文字列"[object Object]"を生成します。

同じことが、比較の両側に起こる - 右側に、順序が異なっているが、それは問題ではありません。結果はではなく、は答えのポイント3と同じになります。違いは、{} + []が行頭にあることです。したがって、{}は空のブ​​ロックとして解釈されます。この状況では、(正しく)普通のオブジェクト表記と解釈されます)。同じキャストロジックが実行され、それが前と同じ文字列を生成します。"[object Object]"

だから、最後に、あなたがtrueを返す"[object Object]" === "[object Object]"を比較しています。再び、により連結された回答のポイント3 - - 第一{}が空きブロックとして解釈されるので、左側はに配列を変換+[]なる{} + [] === [] + {}が同じ生成しないこと

注したがって、比較の結果はfalseになります。 この式をChrome開発ツールでテストすると、実際にはtrueとなります。これは、最初に{}がオブジェクトとして解釈されるようにするChrome will auto-wrap your expression in parenthesesです。 FirefoxまたはノードREPLなどの{} + [] === [] + {}を確認すると、「正しい」falseが生成されます。

5

var array = ['test1', 'test2', 'test3'] 
 
    var emptyObject = {} 
 

 
    console.log(typeof(array+emptyObject)); 
 
    console.log(array+emptyObject); 
 
    console.log(emptyObject+array); 
 
    console.log(array+emptyObject === emptyObject+array); 
 

 
    var array = []; 
 
    var emptyObject = {} 
 

 
    console.log(typeof(array+emptyObject)); 
 
    console.log(array+emptyObject); 
 
    console.log(emptyObject+array); 
 
    console.log(array+emptyObject === emptyObject+array); 
 

 
    var array = ['firstArrayElement', 'secondArrayElement']; 
 
    var object = {a:1, b:2} 
 
    
 
    console.log(typeof(array+object)); 
 
    console.log(array+object); 
 
    console.log(object+array); 
 
    console.log(array+object === object+array); 
 

 
    console.log(['a','b']+['c','d']);

あなたは文字列に空の配列を変換するときは、空の文字列を受け取ります。

、文字列にオブジェクトを({})に変換するときは、常に文字列を受け取る:「[オブジェクトのオブジェクト]」。

配列とオブジェクトにプラス演算子が定義されていませんプラス演算子を使用すると、JSは常に配列とオブジェクトを文字列に変換します。

関連する問題