2015-06-14 18 views
6
let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    let { 
     text, value 
    } = f; 
} 

Việc làm này tạo ra hai vars mới (từ else), tuy nhiên nếu tôi viết nó như vậy:ES6 destructuring, năng động nhượng

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    { 
     text, value 
    } = f; 
} 

tôi nhận được một lỗi cú pháp. Cách tiếp cận tốt nhất ở đây là gì?

+0

Ngoài ra, 'const {text, giá trị} = (typeof f === 'string') ? {văn bản: f, giá trị: f}: f; ' – loganfsmyth

Trả lời

7

Bạn cần dấu ngoặc xung quanh việc chuyển nhượng: (. Live copy on Babel)

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    ({    // (at start 
     text, value 
    } = f);   //) at end 
} 

Bạn cần những Parens cho cùng một lý do you need parens or similar to immediately invoke a function: Để nói sự phân tích cú pháp rằng nó nên mong đợi một biểu thức, không phải là một tuyên bố . Nếu không có parens, khi nó gặp {, nó nghĩ rằng đó là sự khởi đầu của một khối. Nhưng không giống như với chức năng, nó phải được Parens, không phải là một lãnh đạo unary +, ! vv like this:

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    +{     // <== Doesn't work like it does with IIFEs 
     text, value 
    } = f; 
} 
+1

Tốt nhất, cảm ơn! – benhowdle89

+0

Câu trả lời hay. Ghi chú nhỏ: Các dấu ngoặc đơn chỉ cần bao quanh các dấu ngoặc nhọn; bản thân bài tập có thể ở bên ngoài. – Zirak

+0

@Zirak: Không, các parens cần phải có biểu thức phân bổ * toàn bộ *; đó là một lỗi khác: [bit.ly liên kết đến Babel repl (quá lâu để dán trong một bình luận)] (http://bit.ly/1HGPapN). Họ thậm chí có một thông điệp cụ thể cho nó: "Bạn đang cố gắng để gán cho một biểu thức ngoặc, ví dụ: thay vì' ({a}) = 0' sử dụng '({a} = 0)' "Và nếu bạn nghĩ về nó không ngạc nhiên lắm: Với các parens chỉ quanh '{}', nó trông giống như một bộ khởi tạo đối tượng trong parens (vì trong ES6 bạn có thể sử dụng dạng viết tắt đó). –

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