16

JavaScript 1.7 の Mozilla の変更ログに見られるように、彼らは構造化代入を追加しました。悲しいことに、私は構文があまり好きではありません (なぜ a と b を 2 回書くのですか?):

var a, b;  
[a, b] = f();

このようなものはもっと良かったでしょう:

var [a, b] = f();

それはまだ下位互換性があります。Python のような構造化には後方互換性がありません。

とにかく、私が思いついた JavaScript 1.5 の最良の解決策は次のとおりです。

function assign(array, map) {
    var o = Object();
    var i = 0;
    $.each(map, function(e, _) {
        o[e] = array[i++];
    });
    return o;
}

次のように機能します。

var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2

しかし、_ には意味がないので、これは本当に最悪です。名前を格納するのは単なる空のシェルです。しかし残念なことに、JavaScript にはポインターがないため、これが必要です。プラス面では、値が一致しない場合にデフォルト値を割り当てることができます。また、このソリューションは配列をスライスしようとしないことに注意してください。したがって、次のようなことはできません{first: 0, rest: 0}。しかし、その動作が必要な場合は、簡単に実行できます。

より良い解決策は何ですか?

4

4 に答える 4

23

まずvar [a, b] = f()、JavaScript 1.7で問題なく動作します-試してみてください!

次に、次を使用して使用構文を少しスムーズにすることができますwith()

var array = [1,2];
with (assign(array, { var1: null, var2: null }))
{
   var1; // == 1
   var2; // == 2
}

もちろん、これでは既存の変数の値を変更することはできません。そのため、私見では、JavaScript1.7の機能よりもはるかに有用性が低くなります。私が今書いているコードでは、オブジェクトを直接返し、そのメンバーを参照するだけです。1.7の機能がより広く利用できるようになるのを待ちます。

于 2008-10-15T21:25:39.557 に答える
4

ダミーの「_」変数は必要ありません。ウィンドウオブジェクトスコープを使用して、「グローバル」変数を直接作成できます。

window["foo"] = "bar";
alert(foo); // Gives "bar"

ここにいくつかのポイントがあります:

  • この関数は一般的すぎる用語なので、「割り当て」という名前は付けません。
  • JS 1.7の構文にさらに近づけるために、関数に宛先を最初の引数として、ソースを2番目の引数として使用させます。
  • オブジェクトリテラルを使用して宛先変数を渡すことはクールですが、宛先が実際には配列ではなくオブジェクトであるJS1.7の破壊と混同される可能性があります。変数名のコンマ区切りリストを文字列として使用することをお勧めします。

これが私が思いついたものです:

function destructure(dest, src) {  
    dest = dest.split(",");  

    for (var i = 0; i < src.length; i++) {  
        window[dest[i]] = src[i];  
    }  
}  

var arr = [42, 66];  

destructure("var1,var2", arr); 

alert(var1); // Gives 42
alert(var2); // Gives 66
于 2008-10-15T15:47:18.397 に答える
1

PHPstorm 10で行ったことは次のとおりです。

ファイル -> 設定 -> 言語とフレームワーク -> ...

... JavaScript 言語のバージョンを、たとえば JavaScript 1.8.5... に設定します。

-> [適用] をクリックします。

于 2015-12-22T19:19:23.973 に答える