:誰かがjavascriptでこの動作を説明できますか? Firefoxで動作確認済み
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
:誰かがjavascriptでこの動作を説明できますか? Firefoxで動作確認済み
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
+
concatenation operatorは、の評価が0
になるようにします。
このように、a
の値は"0"
であり、b
の値は0
である。
はのECMAScript 11.6.1ザ加算演算子(+)
加算演算子のいずれかからの文字列の連結または数値加算を行います。
レッツがAdditiveExpressionを評価した結果であるLREF:生産AdditiveExpression:次のようにAdditiveExpression + MultiplicativeExpressionが評価されます。
lvalをGetValue(lref)とします。
MultiplicativeExpressionを評価した結果をrrefとします。
rvalをGetValue(rref)とします。
lprimをToPrimitive(lval)とします。
rprimをToPrimitive(rval)とします。
タイプ(lprim)は文字列またはタイプ(rprim)である場合は、次に
、文字列です。 ToString(lprim)とToString(rprim)を連結した結果の文字列を返します。
ToNumber(lprim)とToNumber(rprim)に加算演算を適用した結果を返します。 1135.3の下にある の注を参照してください。
注1無ヒントがヒント番号が与えられたかのようにDateオブジェクトを除くすべてのネイティブのECMAScriptオブジェクトは、ヒントの不在を扱う手順5と6でたToPrimitiveの呼び出しで提供されていません。 Dateオブジェクトは、hint Stringが指定されたかのように、ヒントが存在しないことを処理します。ホストオブジェクトは、他の方法でヒントが存在しないことを処理することがあります。
注記2手順7は、論理演算子の代わりに論理演算子を使用して、関係演算子(11.8.5)の比較アルゴリズムの手順3とは異なります。
[] + 0
は文字列です。
a + b
をJavascriptで記述すると、エンジンはa
とb
の両方をプリミティブに変換します。
結果のプリミティブの少なくとも1つが文字列の場合、文字列の連結が実行されます。それ以外の場合は、数値の加算を行います。
オブジェクト(配列など)をプリミティブに変換するには、エンジンはvalueOf()
を呼び出し、その結果がプリミティブでない場合はtoString()
を呼び出します。
配列の場合、valueOf()
は元の配列(プリミティブではない)を返し、toString()
は配列の内容のコンマ区切り文字列を返します。
したがって、[] + 0
は"" + 0
となり、"0"
となります。
空でない文字列は決して偽ではありません。