2011-08-08 51 views
60
var a,b,c; 
var arr = [1,2,3]; 
[a,b,c] = arr; 

mã này hoạt động hoàn hảo trong Firefox dẫn đến a = 1, b = 2 và c = 3,
nhưng không hoạt động trong Chrome. Có phải lỗi Chrome hoặc
đó không phải là mã javascript hợp lệ không? (Tôi không thể tìm thấy nó trong tài liệu tham khảo javascript)Javascript. Gán các giá trị mảng cho nhiều biến?

Làm cách nào để sửa đổi mã này để phù hợp với Chrome, với thiệt hại tối thiểu?
(Tôi không thực sự muốn viết a = arr [0]; b = arr [1] ... hoặc tương tự với arr.shift() tất cả các thời gian)

T.B. đây chỉ là một ví dụ mã, trong mã thực
tôi nhận được mảng arr từ đâu đó bên ngoài mã của tôi

+1

Điều gì xảy ra trong Chrome? Bạn nhận được thông báo lỗi nào? –

+0

nó mang lại cho tôi những điều sau đây: ReferenceError đối số: Array [0] thông điệp: "-" chồng: "-" loại: "invalid_lhs_in_assignment" __proto__: Lỗi – tsds

+1

FWIW, http://www.jslint.com/ nói rằng nó là tốt (sau khi sửa chữa một số khoảng trắng, mặc dù tôi không biết những gì nó sẽ đánh giá), nhưng http://jshint.com/ nói rằng đó là một nhiệm vụ xấu. – JAAulde

Trả lời

64

Đây là một tính năng mới của JavaScript 1.7 gọi Destructuring assignment:

Destructuring assignment makes it possible to extract data from arrays or objects using a syntax that mirrors the construction of array and object literals.

The object and array literal expressions provide an easy way to create ad-hoc packages of data. Once you've created these packages of data, you can use them any way you want to. You can even return them from functions.

One particularly useful thing you can do with destructuring assignment is to read an entire structure in a single statement, although there are a number of interesting things you can do with them, as shown in the section full of examples that follows.

You can use destructuring assignment, for example, to swap values:

var a = 1; 
var b = 3; 
[a, b] = [b, a]; 

This capability is similar to features present in languages such as Perl and Python.

Thật không may, theo this table of versions, JavaScript 1.7 chưa được triển khai trong Chrome. Nhưng nó phải có mặt ở đó trong:

  • FireFox 2.0+
  • IE 9
  • Opera 11.50.

Hãy thử nó cho chính mình trong jsfiddle này: http://jsfiddle.net/uBReg/

Tôi thử nghiệm này trên Chrome (thất bại), IE 8 (thất bại), và FireFox 5 (mà làm việc, mỗi bảng wiki).

+0

Cấu trúc lại là (có khả năng) [đến như một tính năng ngôn ngữ chính thức] (http://wiki.ecmascript.org/doku.php?id=harmony:destructuring) trong phiên bản tiếp theo của ECMAScript, do đó, Google Chrome chắc chắn sẽ đến đó với giả định đề xuất. – user113716

+1

Điều đó thật tuyệt; có một số tính năng thú vị trong JavaScript 1.7+ ... thật không may là chúng không thể được sử dụng cho các ứng dụng "thế giới thực" vào lúc này do những sự không tương thích của trình duyệt này. –

+0

ok. Bạn có nghĩ rằng có cách nhỏ gọn và rõ ràng hơn để làm giống như a = arr.shift()? – tsds

7

Chỉ có thể cho Javascript 1.7 như đã được trả lời bởi @Justin. Đây là bản dùng thử để mô phỏng nó trong các trình duyệt phổ biến:

function assign(arr, vars) { 
    var x = {}; 
    var num = Math.min(arr.length, vars.length); 
    for (var i = 0; i < num; ++i) { 
     x[vars[i]] = arr[i]; 
    } 
    return x; 
} 
var arr = [1, 2, 3]; 
var x = assign(arr, ['a', 'b', 'c']); 
var z = x.a + x.b + x.c; // z == 6 

Tôi không biết nó hữu ích đến mức nào.

Các vấn đề liên quan