1. ホーム
  2. javascript

[解決済み] var、let、const を使わないオブジェクトのデストラクチャリング

2022-05-13 07:16:16

質問

オブジェクトの再構築で var キーワードが前にない場合、エラーを投げるのはなぜですか?

{a, b} = {a: 1, b: 2};

投げる SyntaxError: expected expression, got '='

次の3つの例は問題なく動作します。

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];

ボーナス質問です。なぜ var は必要ないのでしょうか?

のようなことをすると、問題にぶつかりました。

function () {
  var {a, b} = objectReturningFunction();

  // Now a and b are local variables in the function, right?
  // So why can't I assign values to them?

  {a, b} = objectReturningFunction();
}

どのように解決するのですか?

この問題は {...} 演算子が JavaScript で複数の意味を持つことに起因しています。

いつ { の先頭に表示されます。 ステートメント を表す場合、それは常に ブロック を表し、これは代入できません。もしそれが後で ステートメント として であれば、それはObjectを表します。

var は、この区別をするのに役立ちます。 ステートメント のように グループ化された括弧 :

( {a, b} = objectReturningFunction() );

彼らのドキュメントから https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#assignment_separate_from_declaration_2

<ブロッククオート

注意事項 代入文を囲む括弧( ... )は、宣言なしでオブジェクトリテラルによる構造化代入を使用する場合に必要です。

{a, b} = {a: 1, b: 2} は、左辺の {a, b} がオブジェクトリテラルではなくブロックとみなされるため、スタンドアロン構文としては有効ではありません。

しかし、({a, b} = {a: 1, b: 2}) は有効であり、var {a, b} = {a: 1, b: 2} も同様です。

( ... )式の前にはセミコロンが必要です。さもないと、前の行の関数を実行するために使われる可能性があります。