引数で(a||(a = {}))と有るんですけど、一体全体どういう意味なのでしょうか。
JavaScriptの||
は、
左辺がtrueっぽい値ならば左辺を持ってくる。
左辺がfalseっぽい値ならば右辺を持ってくるという動きをします。
(a||(a = {}))
の場合、左辺はa
ですね。
trueっぽい値、例えば1
、"hoge"
、{name: "taro"}
等が入っている場合、右辺は実行されずそのままa
の値が使われます。
falseっぽい値、例えば0
、""
、null
、undefined
等が入っている場合、左辺は値が無いので右辺を実行して値を探しに行きます。
右辺は(a = {})
のようです。
代入式の実行結果は右辺がそのまま使われますから、
aに{}
を代入しつつ、右辺の評価結果は{}
という空オブジェクトになります。
なぜ初期化の時にnull,undefined,0の時のみmyFuncが実行された後に{"key": "value"}と出力されるのでしょうか。
少し難易度の高い話になりますが、
JavaScriptにはNumber、String、Booleanといったプリミティブ値と、
Object、Array、Functionといったオブジェクト系の値の2種類があります。
JavaScriptは完全なオブジェクト指向言語ではないので、
NumberやString、Booleanといったプリミティブ値はオブジェクトになったりそうでなかったり内部では変換を繰り返し、行ったり来たりします。
JavaScript
1var b = "taro";
2// Stringであるbはこの瞬間だけString型のオブジェクトに変身するので別にエラーになったりはしない
3b.key = "value";
4// その行を抜けるとプリミティブ値に戻るが、その時keyに代入した"value"は捨てられてしまう
5console.log(b.key); // undefined
6console.log(b); // "taro"
7
8// Stringオブジェクトとして生成してみる(非推奨なので普段はやらないでね)
9var c = new String("jiro");
10c.key = "value";
11console.log(c.key); // "value"
12console.log(c); // String {"jiro", key: "value"}
13
14// Stringオブジェクトは.toString()で正式な文字列として変換できるが、その際やっぱりkeyは捨てられる
15var d = c.toString();
16console.log(d); // "jiro"
17console.log(d.key); // undefined
この辺の事情で、数値や文字列をaに代入すると上手く動かないという主張どおりになります。
逆に最初から何かしらのオブジェクトをaに与えておくと、正しく動作するはずです。
一度試してみて下さい。