Phiên bản Javascript nào được hỗ trợ trong node.js


81

Tôi đang bắt đầu với Node.js và tôi đang gặp khó khăn trong việc tìm ra phiên bản JavaScript nào được hỗ trợ bởi nút, điều này khiến tôi khó tìm ra những tính năng nào tôi có thể sử dụng. Đây là những gì tôi biết.

  • Node sử dụng V8
  • V8 triển khai ECMAScript như được chỉ định trong ECMA-262, phiên bản thứ 3
  • ECMA-262, phiên bản thứ 3 là JavaScript 1.5

Với điều này, tôi giả sử tôi có thể sử dụng mã tương thích JavaScript 1.5 trong nút. Tuy nhiên, hóa ra tôi có thể sử dụng Array.forEach, trong số các cấu trúc khác, mặc dù theo MDC, nó không có sẵn cho đến khi Javascript 1.6 - ECMA-262, phiên bản thứ 5.

Tôi làm sai ở đâu? Có tài liệu ở đâu đó trình bày chi tiết các tính năng ngôn ngữ có sẵn không?


Để có bản cập nhật 2015, hãy xem các tính năng ECMAScript 6 có trong Node.js 0.12 .
Dan Dascalescu

Và bản cập nhật 05.2016, theo tài liệu của nodejs , chúng tuân theo đặc điểm kỹ thuật JavaScript ECMA-262, phiên bản thứ 6 và "Tất cả các tính năng ECMAScript 2015 (ES6) được chia thành ba nhóm cho các tính năng vận chuyển, phân đoạn và đang tiến hành"
Petar Donchev Marinov

ECMA-262 là ECMAScript 5.1 là Javascript 1.8.5, xem thêm (cuộn xuống thông số kỹ thuật): developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…
Codebeat

Câu trả lời:


37

Ma trận này (V8 theo sau cột WebKit khá chặt chẽ) dường như trả lời khá tốt câu hỏi "tôi có thể sử dụng những tính năng nào?" nhưng tôi không thể tìm thấy câu trả lời chuẩn cho "phiên bản javascript nào được hỗ trợ?" Theo như tôi có thể nói, câu trả lời tốt nhất là sau: ECMA-262 phiên bản thứ 3 được hỗ trợ, nhưng nhiều tính năng của phiên bản thứ 5 cũng được hỗ trợ.

Có một lời giải thích tốt về lý do tại sao V8 tuân theo chức năng WebKit và JavaScriptCore trên chuỗi này .


1
Cập nhật năm 2020: Xem câu trả lời của Nate Whittaker .
rinogo

32

Phiên bản javascript của Node phụ thuộc vào phiên bản v8 mà Node sử dụng. Phiên bản nút 0.5.1 (14 tháng 7 năm 2011) trở lên sử dụng v8 3.4.10 trở lên và là phiên bản thứ 5 ECMA-262, thay vì Phiên bản thứ 3. Phiên bản thứ 5 tương đương với Javascript 1.8.5. Xem lý do bên dưới.

Từ ngày 21 tháng 5 năm 2011 đến ngày 15 tháng 6 năm 2011, trang web v8 ngừng liệt kê v8 là triển khai phiên bản thứ 3 ECMA-262 và bắt đầu hiển thị phiên bản thứ 5. http://web.archive.org/web/20110521053630/http://code.google.com/p/v8/ http://web.archive.org/web/20110615102350/http://code.google. com / p / v8 /

Theo thay đổi v8, vào ngày 15 tháng 6 năm 2011, v8 đã thay đổi thành phiên bản 3.4.4. Vì vậy, phiên bản đó và sau đó là phiên bản thứ 5.

Theo Node changelog, v8 3.4.10 ở phiên bản Node 0.5.1, ngày 14 tháng 7 năm 2011, do đó, phiên bản đó và sau đó là phiên bản thứ 5 ECMA-26. Điều này không có nghĩa là các phiên bản v8 trước 3.4.10 hoàn toàn là phiên bản thứ 3, vì có thể đã có sự chuyển đổi đều đặn từ thứ 3 sang thứ 5 thông qua nhiều phiên bản v8.


Chà, mặc dù V8 đã chuyển sang phiên bản thứ 5 nhưng không có bằng chứng nào về việc Node thực sự tuân thủ nó hoàn toàn trong các phiên bản 0.5.1+. 0.6.12 của tôi không hỗ trợ Object.prototype.getOwnPropertyNames () mặc dù nó được liệt kê trong ECMA262-5th 15.2.3.4.
soletan

1
Phải sửa nhận xét trước đây của tôi vì phương pháp đã đề cập là phương pháp tĩnh thay vì bị ràng buộc với Object.protoype (thực sự được bao gồm với nút 0.6.12) và do đó không có bằng chứng về việc NodeJS không hỗ trợ đầy đủ ECMA262-5th ...
soletan

19

Có vẻ như, tại một số điểm, node.green được tạo để theo dõi hỗ trợ tính năng JavaScript đối với các phiên bản Node khác nhau.


1

Có vẻ như chúng tôi đã rút gọn thành hai chiến lược để tìm ra phiên bản nút Javascript nào sử dụng:

Chiến lược 1: tin tưởng vào những gì tài liệu nào đó nói ở đâu đó, điều này sai trong nhiều trường hợp. Tôi không tìm thấy bảng chỉ ra các cặp khóa-giá trị của phiên bản nút nào hỗ trợ phiên bản ECMAScript nào.

Chiến lược 2: đoán và kiểm tra.

Tìm một tính năng được ES6 trích dẫn và "xem nó có bị lỗi không", tương tự như sau:

el@apollo:~/code$ echo "console.log('blue'.includes('blue'))" > a.js
el@apollo:~/code$ cat a.js 
console.log('blue'.includes('blue'))
el@apollo:~/code$ node a.js
/home/el/code/javascript/02/a.js:1
ports, require, module, __filename, __dirname) { console.log('blue'.includes('
                                                                    ^
TypeError: undefined is not a function
    at Object.<anonymous> (/home/el/code/javascript/02/a.js:1:82)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3
el@apollo:~/code$ babel-node a.js
true

Tôi cho rằng "babel" ở đây là một tham chiếu đến Tanakh. Phiên bản nút của chúng tôi hỗ trợ những tính năng nào? Tôi không biết, bạn sẽ phải kiểm tra thủ công. Đây sẽ trở thành một MESS khổng lồ. Và tệ hơn, nó dường như đang có chủ đích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.