134

これがMozilla固有のJS構文であるかどうかはわかりませんが、たとえばアドオンSDKドキュメントで、変数がこのように宣言されていることがよくあります。

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

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

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

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

4

4 に答える 4

89

あなたが見ているのは破壊的な割り当てです。これは、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;

これですべてです。

于 2013-03-08T10:44:27.033 に答える
85

どちらもJavaScript1.7の機能です。最初のものはブロックレベルの変数です

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

2つ目は破壊と呼ばれます:

代入を破棄すると、配列リテラルとオブジェクトリテラルの構成を反映した構文を使用して、配列またはオブジェクトからデータを抽出できます。
...
非構造化割り当てで実行できる特に便利なことの1つは、構造全体を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;
于 2013-03-08T10:09:32.590 に答える
3

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

アレイの破壊

破壊せずに

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

console.log(one, two, three);

破壊あり

var foo = ["one", "two", "three"];
var [one, two, three] = foo;

console.log(one, two, three);

オブジェクトの破壊

破壊せずに

var o = {p: 42, q: true};
var p = o.p;
var q = o.q;

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

破壊を伴う

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

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

新しい変数名を割り当てます

var o = { p: 42, q: true };
var { p: foo, q: bar } = o;

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

于 2019-01-07T12:47:44.843 に答える
0

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

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

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

于 2013-03-08T09:48:24.690 に答える