2015-09-03 27 views
8

Vì vậy, desctucturing cơ bản là tốt, {a, b} = obj transpiles để a = obj.a; b = obj.b.Việc triển khai đối tượng ES6 của Babel có đúng không?

Câu hỏi của tôi là xung quanh một chút của một cú pháp kỳ lạ mà tôi vô tình chạy ngang qua và tôi tự hỏi nếu ai đó có thể chỉ cho tôi tại đặc tả kể từ khi tôi không thể tìm thấy nó:

({a, b} = obj).c 

Điều đó không hai a, b bài tập và sau đó trả về obj.c. Nó thực sự khá hữu ích đối với tôi đối với bộ giải mã luồng byte, như tôi có thể viết:

let width = ({bytes} = intDecode(bytes)).number; 

Vấn đề của tôi là tôi chưa thấy cú pháp này ở bất cứ nơi nào và không muốn dựa vào thứ gì đó được triển khai không chính xác hoặc trong giai đoạn đề xuất.

+0

Nó giống như '(obj = số intDecode (byte)). bytes = obj.bytes' (có thể ngoại trừ thứ tự đánh giá) - cùng một cú pháp lẻ trong ES5. Hãy chắc chắn rằng mặc dù 'byte' được khai báo ở đâu đó. – Bergi

Trả lời

3

Không có gì đặc biệt trong Chuyển nhượng cấu trúc: nó được đánh giá là bất kỳ Nhiệm vụ nào khác với nhà điều hành =.

Vì vậy, nó trả về rval.

Điều này có nghĩa là bạn có thể dựa vào cú pháp của bạn.

Một số chi tiết:

Các Destructuring Phần được đánh giá trong 6[1]:

Hãy status thể là kết quả của việc thực hiện DestructuringAssignmentEvaluation của assignmentPattern sử dụng rval làm đối số.

và sau mục này, việc đánh giá bài tập diễn ra như thường lệ, như trong trường hợp a = b = 42;.

Tài liệu tham khảo:

+0

Tuy nhiên, có thể cho rằng 'rval' thực sự ở đây là gì. 12.4.4 (1.a) - 'Cho rref là kết quả của việc đánh giá AssignmentExpression.' - Tôi cho rằng trong' ({a} = obj) ',' rval === obj.a', _not_ 'obj' –

+0

@zyklus không, 'rval' là giá trị của toán hạng bên phải của toán tử' = '. '4. Cho rval là GetValue (rref) .' – zerkms

+1

Trong biểu thức '({a} = obj)' 'rval' là' obj', theo đặc tả. 'obj.a' được tra cứu trong quá trình đánh giá gán destructuring có' obj' được truyền vào như một tham số. – zerkms

1

Vâng, nó được dự kiến ​​sẽ làm việc như thế này (xem câu trả lời @zerkms' để biết chi tiết). Rằng bạn chưa thấy cú pháp ở bất cứ nơi nào là bởi vì nó không thực sự tốt để truy cập các thuộc tính trên kết quả của một biểu thức gán, vì nó làm cho mã không thể đọc được. Cho dù bạn gán cho một biến bình thường hoặc một biểu thức phá hoại không tạo ra nhiều khác biệt ở đây.

Tuy nhiên, bạn có thể khá dễ dàng chuyển đổi mã vào một nhiệm vụ destructuring hợp lý:

let {bytes, number:width} = intDecode(bytes); 

hoặc trên thực tế, chặt chẽ hơn để mã ban đầu của bạn:

let width; 
({bytes, number:width} = intDecode(bytes)); 
+0

@Felix Kling: những dấu ngoặc đơn đó chỉ trông giống mã gốc của OP hay cái gì khác? – zerkms

+2

@zerkms: '{...} = foo' là lỗi cú pháp vì' {} 'được hiểu là khối. Dấu ngoặc đơn cần phải thực thi chúng được phân tích cú pháp dưới dạng mẫu. –

+0

Ồ đúng ....... – zerkms

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