Javascript Làm thế nào để xác định nhiều biến trên một dòng?


103

Đọc tài liệu trực tuyến, tôi đang bối rối làm thế nào để xác định đúng nhiều biến JavaScript trên một dòng.

Nếu tôi muốn cô đọng đoạn mã sau, cách thích hợp của JavaScript "nghiêm ngặt" để xác định nhiều biến javascript trên một dòng là gì?

var a = 0;
var b = 0;

Là nó:

var a = b = 0;

hoặc là

var a = var b = 0; 

Vân vân...


1
Thông tin thêm về nhiều phép gán: Phép gán biến hoạt động như thế nào trong JavaScript? . Tôi thấy mẫu này hữu ích bên trong một bao đóng để hiển thị các hàm tạo:var $cls = my.namespace.Foo = function(args){ ... }
blong

Tôi tự hỏi tại sao bạn muốn cô đọng nó ngay từ đầu. IMHO khai báo và gán hết biến thể này đến biến thể khác rõ ràng và dễ hiểu hơn nhiều đối với bất kỳ ai.
Henning

Câu trả lời:


76

Bạn muốn dựa vào dấu phẩy vì nếu bạn dựa vào cấu trúc nhiều phép gán, bạn sẽ tự bắn vào chân mình ở điểm này hay điểm khác.

Một ví dụ sẽ là:

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

Tất cả chúng đều tham chiếu đến cùng một đối tượng trong bộ nhớ, chúng không phải là "duy nhất" vì bất cứ lúc nào bạn thực hiện tham chiếu đến một đối tượng (mảng, đối tượng theo nghĩa đen, hàm) nó được truyền bằng tham chiếu chứ không phải giá trị. Vì vậy, nếu bạn chỉ thay đổi một trong những biến đó và muốn chúng hoạt động riêng lẻ, bạn sẽ không đạt được những gì bạn muốn vì chúng không phải là các đối tượng riêng lẻ.

Ngoài ra còn có một nhược điểm trong việc gán nhiều lần, đó là các biến phụ trở thành hình cầu và bạn không muốn rò rỉ vào không gian tên chung.

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

Tốt nhất chỉ nên sử dụng dấu phẩy và tốt nhất là có nhiều khoảng trắng để nó có thể đọc được:

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

2
Đó thực sự là một vấn đề với việc gán các tham chiếu mảng nói chung, không chỉ với các câu lệnh gán dưới dạng giá trị.
Matthew Flaschen

"Vì vậy, trong khi bạn có thể nhận được ngay với nhiều bài tập tay phải cho những thứ như literals số"
Meder omuraliev

1
@meder, đó là một vấn đề với bất kỳ bài tập nào. Không có gì đặc biệt về tay phải.
Matthew Flaschen

Ý tôi là các nhiệm vụ nói chung. Đã chỉnh sửa từ ngữ.
meder omuraliev

2
Một cái gì đó để giữ trong tâm trí với mô hình phân công nhiều này là bất kỳ chuyển nhượng không được công bố, dưới ES5 chế độ nghiêm ngặt, sẽ gây ra một ReferenceErrorngoại lệ ... IMO, họ cần phải tránh ...
CMS

64

Sử dụng nút hoặc es6 của Javascript, bạn có thể làm như sau:

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

Và nếu bạn muốn dễ dàng in nhiều biến trong một dòng, chỉ cần thực hiện điều này:

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

0 1 2 3

Điều này tương tự như câu trả lời của @alex gray ở đây, nhưng ví dụ này là bằng Javascript thay vì CoffeeScript.

Lưu ý rằng điều này sử dụng phép gán cấu trúc mảng của Javascript


2
tại sao không sử dụng console.log(a,b,c,d)trong trường hợp này thay thế? nó ngắn hơn và cho cùng một đầu ra
Josh Broadhurst

44

Không có cách nào để làm điều đó trong một dòng với gán là giá trị.

var a = b = 0;

làm cho b toàn cầu. Một cách chính xác (không làm rò rỉ các biến) là dài hơn một chút:

var a = 0, b = a;

hữu ích trong trường hợp:

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

1
"Không có cách nào để sử dụng phép gán làm giá trị mà không lặp lại 0." - Ý anh là gì?
palswim

28

Tại sao không làm nó trong hai dòng?

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

Lý do tại sao, là để duy trì phạm vi cục bộ trên các khai báo biến, như sau:

var a = b = c = d = 1;

sẽ dẫn đến sự khai báo ngầm của b, cdtrên phạm vi cửa sổ.


Điều này hữu ích cho tôi vì tôi khai báo trước nhiều biến trong chương trình của mình. Bây giờ, thay vì mất hơn 30 dòng, tôi có thể sử dụng một vài dòng mà không bị mất khả năng đọc.
Kalif Vaughn

11

Đây là phương pháp ES6 mới để khai báo nhiều biến trong một dòng:

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

let {name, age, id} = person;

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

* Tên biến và chỉ mục đối tượng của bạn cần giống nhau


2
Nó dài hơn câu hỏi của OP, vì nó tương đương với let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu

4

Cụ thể như những gì OP đã hỏi, nếu bạn muốn khởi tạo N biến có cùng giá trị (ví dụ 0), bạn có thể sử dụng cấu trúc mảngArray.fill để gán cho các biến một mảng gồm N 0s:

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

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


0

lưu ý rằng bạn chỉ có thể làm điều này với Numbers và Strings

bạn có thể làm ...

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

c++;
// c = 1, b = 0, a = 0;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.