私はRubyやJavaScriptのような言語では、いくつかの奇妙について昨日、このかなり面白いscreencastを見てきましたし、男がいることを示しています。私は行くことに決めました...Array + Arrayが空の文字列と等しいのはなぜですか?
[] + [] -> "" // returns empty string
ない非常に明白
より多くの情報を取得するECMAscript language specification。
11.6.1加算演算子(+)
加算演算子のいずれかの文字列の連結または数値加算を実行する:私は言う
+
オペレータの実装(P.75)を始めました。
AdditiveExpression:AdditiveExpression + MultiplicativeExpressionは、次のように評価されます。
1. AdditiveExpressionを評価した結果をlrefとします。
2. lvalをGetValue(lref)とします。
3. MultiplicativeExpressionを評価した結果をrrefとします。
4. rvalをGetValue(rref)とします。
5. lprimをToPrimitive(lval)にします。
6. rprimをToPrimitive(rval)にします。
7.タイプ(lprim)がストリングまたはタイプ(rprim)がストリングの場合、
a。 ToString(lprim)とToString(rprim)を連結した結果の文字列を返します。
8. ToNumber(lprim)とToNumber(rprim)に加算演算を適用した結果を返します。 11.6.3の注を参照してください。注記ヒントは、手順5および6のToPrimitiveの呼び出しでは提供されません。日付オブジェクト以外のすべてのネイティブECMAScriptオブジェクトは、ヒント番号が指定されたかのようにヒントが存在しないことを処理します。 Dateオブジェクトは、hint Stringが指定されたかのように、ヒントが存在しないことを処理します。ホストオブジェクトは、他の何らかの方法でヒントがないことを処理することがあります。
注記2手順7は、論理演算子の代わりに論理演算子を使用して、関係演算子(11.8.5)の比較アルゴリズムの手順3とは異なります。
私の推測では、ポイント7は、誰かがために非常に簡単な説明を提供することができ、前述したように異なる評価/変換によって、いくつかの方法で達成されたが、私は本当に...
をhappenningれているものを把握することはできませんということでしたこの ?
私は、なぜ答えることを試みるために少し良くこのすべてを理解して喜んだ:
[] + {} -> [object Object]
{} + [] -> 0
は今より理にかなっています。仕様は、かなり入り込むことができますが、今ではいくつかのリードを持っています。ありがとう。 –
@DidierGhysうん、オブジェクトリテラルに注意すると、javascriptはできるだけブロックとしてそれらを扱うことが非常に熱望されています。 – Esailija
私はそれを念頭に置いておきます。 –