JavaScript 1行で複数の変数を定義するにはどうすればよいですか?


103

オンラインでドキュメントを読んでいると、複数のJavaScript変数を1行で適切に定義する方法がわかりません。

次のコードを要約したい場合、1行に複数のJavaScript変数を定義する適切なJavaScriptの「厳密な」方法は何ですか?

var a = 0;
var b = 0;

それは...ですか:

var a = b = 0;

または

var a = var b = 0; 

等...


1
複数割り当ての詳細:JavaScriptで変数割り当てはどのように機能しますか?。私は、コンストラクタ関数を公開するクロージャ内の便利なこのパターンを見つける:var $cls = my.namespace.Foo = function(args){ ... }
blong

そもそもなぜそれを凝縮したいのかしら。IMHOは、変数を1つずつ宣言して割り当てることで、誰にとってもより明確で理解しやすくなります。
ヘニング

回答:


76

複数の割り当て構造に依存している場合は、足元のどこかで自分を撃つことになるので、コンマに依存する必要があります。

例は次のとおりです。

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

それらはすべてメモリ内の同じオブジェクトを参照します。オブジェクト(配列、オブジェクトリテラル、関数)への参照を作成すると、値ではなく参照によって渡されるため、「一意」ではありません。したがって、これらの変数の1つだけを変更し、それらを個別に動作させたい場合、それらは個別のオブジェクトではないため、必要なものが得られません。

複数の割り当てには、2次変数がグローバルになり、グローバル名前空間にリークしたくないという欠点もあります。

(function() {  var a = global = 5 })();
alert(window.global) // 5

読みやすくするために、カンマだけを使用することをお勧めします。できれば、多くの空白を入れてください。

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
これは、代入ステートメントを値として使用するだけでなく、配列参照の割り当てに関する一般的な問題です。
Matthew Flaschen、

「したがって、数値リテラルなどの複数の右手割り当てを
回避

1
@meder、それは割り当ての問題です。右手について特別なことは何もありません。
マシューFlaschen

私は一般的に割り当てを意味しました。編集された表現。
meder omuraliev 2010年

2
この複数の割り当てパターンについて覚えておくReferenceErrorべきことは、ES5 Strict Modeで宣言されていない割り当ては例外を引き起こすことです... IMO、それらは回避する必要があります...
CMS

64

JavaScriptのes6またはノードを使用すると、次のことができます。

var [a,b,c,d] = [0,1,2,3]

また、複数の変数を1行で簡単に出力する場合は、次のようにします。

console.log(a, b, c, d)

0 1 2 3

これはここでの@alex grayの回答に似ていますが、この例はCoffeeScriptではなくJavaScriptにあります。

これは、Javascriptの配列を破壊する割り当てを使用することに注意してください。


2
console.log(a,b,c,d)代わりにこのケースで使用しないのはなぜですか?それはより短く、同じ出力を提供します
ジョシュブロードハースト2018年

44

割り当てを値として1行で行う方法はありません。

var a = b = 0;

bをグローバルにします。正しい方法(変数のリークなし)は少し長くなります。

var a = 0, b = a;

これは次の場合に便利です。

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
「0を繰り返さずに値として代入を使用する方法はありません。」- どういう意味ですか?
palswim

28

2行で実行してみませんか?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

理由は、次のように変数宣言のローカルスコープを保持するためです。

var a = b = c = d = 1;

の暗黙の宣言bcおよびdウィンドウスコープにつながります。


プログラムで多くの変数を事前に宣言しているので、これは私にとって便利でした。今では、30行以上をとる代わりに、読みやすさを犠牲にすることなく数行を使用できます。
Kalif Vaughn

11

これは、1行で複数の変数を宣言する新しいES6メソッドです。

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* 変数名とオブジェクトインデックスは同じである必要があります


2
OPの質問よりも長くなりlet { a, b } = { a: 0, b: 0 }ます。これはと同等であるためです。
Dan Dascalescu


0

これは数値と文字列でのみ実行できることに注意してください

あなたができる...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.