Javascript Bagaimana mendefinisikan banyak variabel dalam satu baris?

103

Saat membaca dokumentasi online, saya bingung bagaimana cara mendefinisikan beberapa variabel JavaScript dengan benar dalam satu baris.

Jika saya ingin menyingkat kode berikut, apa cara JavaScript "ketat" yang tepat untuk mendefinisikan beberapa variabel javascript dalam satu baris?

var a = 0;
var b = 0;

Apakah itu:

var a = b = 0;

atau

var a = var b = 0; 

dll ...

HeatherK
sumber
1
Lebih lanjut tentang tugas ganda: Bagaimana tugas variabel bekerja di JavaScript? . Saya menemukan pola ini berguna di dalam closure untuk mengekspos fungsi konstruktor:var $cls = my.namespace.Foo = function(args){ ... }
blong
Saya bertanya-tanya mengapa Anda ingin memadatkannya di tempat pertama. IMHO mendeklarasikan dan menetapkan variabel satu demi satu jauh lebih jelas dan lebih mudah dipahami oleh siapa pun.
Henning

Jawaban:

76

Anda ingin mengandalkan koma karena jika Anda mengandalkan konstruksi tugas ganda, Anda akan gagal pada satu titik atau lainnya.

Contohnya adalah:

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

Mereka semua merujuk ke objek yang sama dalam memori, mereka tidak "unik" karena setiap kali Anda membuat referensi ke suatu objek (array, literal objek, fungsi), referensi itu diteruskan oleh referensi dan bukan nilai. Jadi jika Anda mengubah hanya satu dari variabel itu, dan ingin mereka bertindak secara individual, Anda tidak akan mendapatkan apa yang Anda inginkan karena mereka bukan objek individual.

Ada juga kerugian dalam beberapa penetapan, yaitu variabel sekunder menjadi global, dan Anda tidak ingin bocor ke namespace global.

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

Yang terbaik adalah menggunakan koma dan lebih disukai dengan banyak spasi agar dapat dibaca:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];
meder omuraliev
sumber
2
Itu benar-benar masalah dengan menugaskan referensi array secara umum, tidak hanya dengan pernyataan penugasan sebagai nilai.
Matthew Flaschen
"Jadi, sementara Anda dapat menggunakan beberapa tugas tangan kanan untuk hal-hal seperti literal numerik"
meder omuraliev
1
@meder, ini masalah dengan penugasan apa pun. Tidak ada yang istimewa dari tangan kanan.
Matthew Flaschen
Maksud saya tugas secara umum. Kata-kata yang diedit.
meder omuraliev
2
Sesuatu yang perlu diingat dengan pola penugasan ganda ini adalah bahwa penugasan yang tidak dideklarasikan, di bawah Mode Ketat ES5, akan menyebabkan ReferenceErrorpengecualian ... IMO, tugas tersebut harus dihindari ...
CMS
64

Dengan menggunakan es6 atau node Javascript, Anda dapat melakukan hal berikut:

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

Dan jika Anda ingin dengan mudah mencetak banyak variabel dalam satu baris, lakukan ini:

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

0 1 2 3

Ini mirip dengan jawaban @alex grey di sini, tetapi contoh ini ada dalam Javascript dan bukan CoffeeScript.

Perhatikan bahwa ini menggunakan tugas penghancuran array Javascript

modulitos
sumber
2
mengapa tidak digunakan console.log(a,b,c,d)dalam kasus ini saja? itu lebih pendek dan memberikan hasil yang sama
Josh Broadhurst
44

Tidak ada cara untuk melakukannya dalam satu baris dengan tugas sebagai nilai.

var a = b = 0;

membuat b global. Cara yang benar (tanpa membocorkan variabel) adalah sedikit lebih lama:

var a = 0, b = a;

yang berguna dalam kasus:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;
Matthew Flaschen
sumber
1
"Tidak ada cara untuk menggunakan tugas sebagai nilai tanpa mengulang 0." - maksud kamu apa?
palswim
28

Mengapa tidak melakukannya dalam dua baris?

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

Alasannya, adalah untuk mempertahankan cakupan lokal pada deklarasi variabel, seperti ini:

var a = b = c = d = 1;

akan mengarah ke deklarasi implisit b, cdan dpada lingkup jendela.

Nick L.
sumber
Ini berguna bagi saya karena saya mendeklarasikan banyak variabel di muka dalam program saya. Sekarang, daripada mengambil 30+ baris, saya dapat menggunakan beberapa baris tanpa mengorbankan keterbacaan.
Kalif Vaughn
11

Berikut adalah metode ES6 baru untuk mendeklarasikan beberapa variabel dalam satu baris:

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

let {name, age, id} = person;

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

* Nama variabel dan indeks objek Anda harus sama

Pangeran Ahmed
sumber
2
Itu lebih panjang dari pertanyaan OP, karena itu setara dengan let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu
4

Khusus untuk apa yang diminta OP, jika Anda ingin menginisialisasi N variabel dengan nilai yang sama (misalnya 0), Anda dapat menggunakan array destructuring dan Array.fill untuk menetapkan ke variabel array N 0s:

let [a, b, c, d] = Array(4).fill(0);

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

Dan Dascalescu
sumber
0

perhatikan Anda hanya dapat melakukan ini dengan Angka dan String

kamu bisa melakukan ...

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

c++;
// c = 1, b = 0, a = 0;
PDA
sumber