2016-01-26 32 views
12

Tại sao nhà điều hành mạng không thể sử dụng nhiều lần?Sử dụng toán tử spread nhiều lần trong javascript?

let arr = [[[1, 2, 3]]]; 

console.log(arr); // Array [ Array[1] ] 
console.log(...arr); // Array [ Array[3] ] 
console.log(...(...arr)); 
// SyntaxError: expected '=>' after argument list, got ')' 

Tôi mong chờ:

console.log(...(...arr)); // Array [ 1, 2, 3 ] 
+0

'... (arr)' công trình. nó giống như '... arr' – madox2

+1

Theo thông số ES6 khi toán tử spread gặp phải một iterator được tạo ra từ một đối tượng spread là kết quả của việc đánh giá biểu thức gán trong ví dụ làm việc của bạn' arr' e.g. '... arr'. Với 'console.log (... (... arr));' bạn đang cố truyền biểu thức phép toán spread + biểu thức gán cho một toán tử spread khác. Xem http://www.ecma-international.org/ecma-262/6.0/#sec-argument-lists – br3w5

+0

Bạn có thể muốn thử 'console.log (... []. Concat (... arr)) '(hoặc bất kỳ hàm' flatten'ing nào khác) – Bergi

Trả lời

11

Tại sao nhà điều hành mạng không thể sử dụng nhiều lần?

... không phải là toán tử. (...arr) không phải là JavaScript hợp lệ. ... chỉ được phép bên trong mảng chữ và trong danh sách đối số, nhưng đó là các dạng cú pháp đặc biệt (chú ý ... trong quy tắc sản xuất bên dưới).

ArrayLiteral

ArrayLiteral : 
    [ Elision_opt ] 
    [ ElementList ] 
    [ ElementList , Elision_opt ] 

ElementList : 
    Elision_opt SpreadElement 
    ElementList , Elision_opt SpreadElement 

SpreadElement: 
    ... AssignmentExpression 

Arguments

Arguments : 
    () 
    (ArgumentList) 

ArgumentList : 
    AssignmentExpression 
    ... AssignmentExpression 
    ArgumentList , AssignmentExpression 
    ArgumentList , ... AssignmentExpression 
+0

Tôi tin rằng việc lan truyền một mảng đã lan truyền sẽ không đánh giá, nhưng hóa ra tôi đã sai, bởi vì nó có. Điều này có vẻ là câu trả lời đúng duy nhất. +1 – Trace

+1

Vì vậy, bạn đang nói rằng nhà điều hành dàn trải không phải là một nhà điều hành? – madox2

+1

@ madox2: Có. Tôi không biết những người đã đưa ra thuật ngữ "nhà điều hành lây lan", nhưng nó chắc chắn không phải là một nhà điều hành theo nghĩa JavaScript. Nó chỉ là một dấu hiệu. –

0

Bởi vì ... arr không giống như một hàm trả về một giá trị trong tình huống bình thường (bạn có thể kiểm tra điều này bằng cách chỉ cần gõ ... [[1 , 2,3]] trong giao diện điều khiển, nếu ... hoạt động như một chức năng bình thường, chúng tôi mong đợi sự trở lại của [1 2 3] Vì lý do đó bạn không thể chuỗi lây lan từ MDN:

toán tử spread cho phép một biểu thức được mở rộng ở các vị trí trong đó Các đối số điện tử (cho các cuộc gọi hàm) hoặc nhiều phần tử (đối với các mảng chữ) được mong đợi.

Ergo, lây lan cần phải xảy ra trong vòng literals mảng, literals đối tượng (nếu sử dụng obj lây lan, đó là ES7) hoặc trong chức năng gọi Vì vậy, bạn có thể làm console.log (... []. Concat (. ..arr))

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