JavaScriptオブジェクトリテラル同士の代入
他人のソースコードの中に次のような構文を見かけました。
var {p:r, q:s} = {p:"foo", q:"bar"};
質問ですが、(1)これは何をしているものなのでしょうか。入門レベルのサイトを検索しましたが分かりませんでした。糖衣構文の一種なのでしょうか。動作環境はfirefoxです。
(2)r,sがwindowオブジェクト直下のグローバル変数として定義されるのはなぜですか?
(3)varを付けないと構文エラーになるのはなぜですか?
{p:r, q:s} = {p:"foo", q:"bar"};// SyntaxError: invalid label
(4)また、例えば
var obj1={a:"b"};
としたとき、
obj1.a="b";
のようにkeyを指定してvalueにアクセスできますが、上記構文を実行した場合デバッガでp,qが存在しないのはなぜですか?
(5)オブジェクト、配列、連想配列の"="によるコピーはshallow copyですが、この構文ではdeep copyになるのですか?
// shallw copy
var test={p:"hoge",q:"piyo"},test2={p:"miko",q:"nuko"};
test=test2;
test2.p="fuga";// test.p is "fuga" test.q is "nuko"
// deep copy
var test2={p:"miko",q:"nuko"};
var {p:r,q:s}=test2;
test2.p="fuga";// window.r is "miko" window.s is "nuko" so r,s is not alias
(6)もし、この構文で左辺のvalueをグローバル変数として定義や再定義するような意味があると仮定すると、次のコードを実行すると2行目で文法エラーになるのはなぜですか?
var obj2={a:"dummy"};
var {p:obj2.a}={p:"a"}; // SyntaxError: missing variable name
解説しているサイトのご提示でも問題ありませんが、仕様書等の場合はページ内の大まかな記載場所を併記してもらえると幸いです。
よろしくお願いします。
お礼
文字列しか使えないのがオブジェクトの特徴のようですね。