web-dev-qa-db-ja.com

`var {...} = ...`ステートメントの波括弧は何をしますか?

これがMozilla固有のJS構文であるかどうかはわかりませんが、たとえば add-on SDK docs

var { Hotkey } = require("sdk/hotkeys");

また、さまざまなchrome Javascript(letの代わりにvarステートメントが使用されています)、

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

非常に紛らわしいと思いましたが、 [〜#〜] mdn [〜#〜] でも、両方の構文に関するドキュメントを見つけることができません。

103
timdream

どちらもJavaScript 1.7の機能です。 1つ目は ブロックレベル変数

letを使用すると、変数を宣言し、そのスコープを、それが使用されるブロック、ステートメント、または式に制限できます。これは、ブロックスコープに関係なく、関数全体に対して変数をグローバルまたはローカルに定義するvarキーワードとは異なります。

2つ目は destructuring と呼ばれます:

割り当てを分解すると、配列リテラルとオブジェクトリテラルの構造を反映した構文を使用して、配列またはオブジェクトからデータを抽出できます。
...
破壊代入でできる特に便利なことの1つは、単一のステートメントで構造全体を読み取ることです。ただし、次の例でいっぱいのセクションに示すように、それらを使用していくつかの興味深いことができます。 。

Pythonに慣れている人にとっては、次の構文に似ています。

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

最初のコードチャンクは、次の短縮形です。

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

2番目のコードチャンクを次のように書き換えることができます。

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;
64
Blender

あなたが見ているのは、破壊的な課題です。 Haskellのような パターンマッチング の形式です。

構造化代入を使用すると、オブジェクトと配列から値を抽出し、オブジェクトと配列リテラル構文を使用して新しく宣言された変数に割り当てることができます。これにより、コードがより簡潔になります。

例えば:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

上記のコードは次と同等です:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

同様に配列の場合:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

これは次と同等です:

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

次のようにオブジェクトプロパティを抽出して名前を変更することもできます。

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

これは次と同等です:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

これですべてです。

71
Aadit M Shah

これはJavascriptの破壊的な割り当てであり、ES2015標準の一部です。配列の値またはオブジェクトのプロパティを個別の変数にアンパックまたは抽出します。例:Array Destructuring

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

// var [one、two、three] = fooを破壊します

例:オブジェクトの破壊

var o = {p:42、q:true}; var {p、q} = o;

console.log(p); // 42 console.log(q); // true

//新しい変数名を割り当てるvar {p:foo、q:bar} = o;

console.log(foo); // 42 console.log(bar); // true

1
Deeksha Sharma

MDNのletステートメントに関するドキュメントがあります。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

letは、宣言された変数のスコープを制限するという点でvarと似ています。これにより、if(){}ブロック(または他のブロック)内で変数を宣言し、その変数をそのブロック内でのみ「可視」にすることができます(これまでJavaScriptは、他のほとんどのブロックスコープではなく、関数スコープを持ちます言語)。したがって、letは基本的に、多くの人が問題を抱えている何かの「修正」です。 tihsはJavaScript 1.7の機能であることに注意してください。

{Foo}に何も見つかりませんでした。

0
Jan Hančič