2016-10-16 14 views
37

Tôi có một câu hỏi về việc tại sao nút v6.7 sẽ thất bại trong việc chạy mã này:Node v6 thất bại trên đối tượng lây lan

var a = { 
    foo: 'bar' 
} 

var b = { 
    ...a, 
    my: 'sharona' 
} 
console.log(b) 

Bất cứ ai có một ý tưởng tại sao điều đó sẽ là gì? Tôi nghĩ rằng v6 hỗ trợ đối tượng lan rộng ..? Nhưng tôi đoán là không? Đây là lỗi tôi thấy:

/home/teselagen/ve/tnrtest.js:6 
    ...a, 
    ^^^ 
SyntaxError: Unexpected token ... 
    at Object.exports.runInThisContext (vm.js:76:16) 
    at Module._compile (module.js:528:28) 
    at Object.Module._extensions..js (module.js:565:10) 
    at Module.load (module.js:473:32) 
    at tryModuleLoad (module.js:432:12) 
    at Function.Module._load (module.js:424:3) 
    at Module.runMain (module.js:590:10) 
    at run (bootstrap_node.js:394:7) 
    at startup (bootstrap_node.js:149:9) 
    at bootstrap_node.js:509:3 
+2

Làm việc trong Nút 8 bằng cờ --harmony. –

+0

Hoạt động trong nút 8.3.0 ngay cả khi không có cờ – Subin

Trả lời

37

Có vẻ như toán tử ES6 chỉ hoạt động đối với mảng và vòng lặp. Nó được thiết kế đặc biệt để KHÔNG LÀM VIỆC cho các đối tượng: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator

quote liên quan:

Chỉ áp dụng cho iterables

var obj = {"key1":"value1"}; 
function myFunction(x) { 
    console.log(x); // undefined 
} 
myFunction(...obj); 
var args = [...obj]; 
console.log(args, args.length) //[] 0 

Mặc dù bài viết MDN trước đây gợi ý rằng cố gắng sử dụng toán tử spread trên các đối tượng sẽ dẫn đến undefined thay vì ném một lỗi. Kể từ this revision, bài viết MDN hiện tại thảo luận về hỗ trợ cho "Spread for literals object"

Ngoài ra bảng tương thích node.js tuyên bố node.js hoàn toàn tuân thủ đặc tả của toán tử spread với mảng và vòng lặp, nhưng đối tượng thuộc tính còn lại/lây lan không được hỗ trợ: http://node.green/#ESNEXT-candidate--stage-3--object-rest-spread-properties, ít nhất là không cho đến Node phiên bản 8.60 (lúc này màu sắc chuyển sang màu xanh để chỉ ra rằng đầu trong 8.3, Node không hỗ trợ các nhà điều hành đối tượng lây lan/nghỉ ngơi, as pointed out in the other answer)

+1

Tôi nghĩ rằng họ đang sử dụng đối tượng lan truyền qua cờ '--harmony_destructuring' trong các phiên bản trước, nhưng đã xóa nó vì nó" không phải là tiêu chuẩn ". Nó rất hữu ích cho nguyên mẫu nhanh thay vì sử dụng Babel cho mọi thứ ... :-( –

+1

Điều này hiện đã lỗi thời.Đối tượng lan truyền không hoạt động trong trình duyệt hiện đại, và nằm trong nút 8 – superluminary

40

Sử dụng phần còn lại/lây lan với các đối tượng là một đề xuất riêng biệt, mà bạn có thể đọc về here. Một đề xuất không được chấp nhận cho bản phát hành ES hàng năm trừ khi nó đạt đến giai đoạn 4, và nó hiện đang ở giai đoạn 3. Nó có thể được đưa vào ES2018. Nếu bạn muốn sử dụng nó ngay bây giờ, bạn sẽ phải sử dụng một transpiler như babel.


EDIT: Tính đến Node v8.3, đối tượng còn lại/lây lan hiện có sẵn mà không cần bất kỳ transpilation.

+0

Tôi có nút 8.6 và vẫn gặp sự cố – user3808307

+0

Bạn có chắc là bạn đang sử dụng 8.6 không? Hãy thử thêm 'console.log (process.version)' vào đầu tập lệnh để đảm bảo rằng nó đang chạy phiên bản đó. – saadq

+0

có, đó là vấn đề với mã của tôi – user3808307

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