JavaScriptでの割り当ての破壊
-
03-07-2019 - |
質問
JavaScript 1.7のMozilla changlogに見られるように、彼らは破壊的な割り当てを追加しました。悲しいことに、構文があまり好きではありません(なぜ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}
のようなことはできません。ただし、その動作が必要な場合は、簡単に実行できます。
より良い解決策は何ですか?
解決
最初に、 var [a、b] = f()
はJavaScript 1.7で問題なく動作します-試してください!
次に、 with()
:
var array = [1,2];
with (assign(array, { var1: null, var2: null }))
{
var1; // == 1
var2; // == 2
}
もちろん、既存の変数の値を変更することはできませんので、私見ではJavaScript 1.7の機能よりもはるかに有用ではありません。私が書いているコードでは、今、オブジェクトを直接返し、そのメンバーを参照しています。1.7の機能がより広く利用可能になるのを待ちます。
他のヒント
ダミーの" _"は不要です。変数。 「グローバル」を直接作成できます。ウィンドウオブジェクトスコープを使用した変数:
window["foo"] = "bar";
alert(foo); // Gives "bar"
さらにいくつかのポイントがあります:
- この関数には名前を付けません "割り当て"それはあまりにも一般的だから 用語。
- JSにより似たものにするため 1.7構文、関数が最初に宛先を取得するようにします 引数とソースとして 2番目の引数。
- オブジェクトリテラルを使用して宛先変数を渡すのは便利ですが、宛先が実際には配列ではなくオブジェクトである場合のJS 1.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
PHPstorm 10で行ったことは次のとおりです。
ファイル-&gt;設定-&gt;言語とフレームワーク-&gt; ...
... JavaScript言語バージョンを、たとえばJavaScript 1.8.5 ...
-&gt; [適用]をクリックします。
標準のJavaScriptでは、あらゆる種類のさに慣れており、中間変数を使用して構造化代入をエミュレートするのも悪くありません。
function divMod1(a, b) {
return [ Math.floor(a / b), a % b ];
}
var _ = divMod1(11, 3);
var div = _[0];
var mod = _[1];
alert("(1) div=" + div + ", mod=" + mod );
ただし、次のパターンはよりイデマティックだと思います:
function divMod2(a, b, callback) {
callback(Math.floor(a / b), a % b);
}
divMod2(11, 3, function(div, mod) {
alert("(2) div=" + div + ", mod=" + mod );
});
2つの結果を配列として返す代わりに、コールバック関数に引数として渡すことに注意してください。
( http://jsfiddle.net/vVQE3/ で実行されているコードを参照)