Tiêu chuẩn ECMAScript 6 đã thêm nhiều tính năng mới vào ngôn ngữ JavaScript, bao gồm ký hiệu chức năng mũi tên mới .
Nhiệm vụ của bạn là viết một bộ chuyển đổi ES6-ES5 cơ bản. Chỉ cung cấp một chức năng mũi tên ES6 làm đầu vào, đầu ra đối tác tương thích ES5 của nó.
Đó là môn đánh gôn ! Có thể chương trình ngắn nhất trong byte giành chiến thắng!
Những thứ cơ bản
Một hàm mũi tên trông như thế này:
(a, b, c) => { return a + b - c }
Và biểu thức hàm ES5 tương đương của nó trông như thế này:
function(a, b, c) { return a + b - c }
Nói chung, bạn có thể sao chép phần thân của hàm (mọi thứ giữa các dấu ngoặc nhọn) nguyên văn.
Tuyên bố hoàn trả ngầm
Thay vì một cơ thể với niềng răng xoăn, một biểu thức duy nhất có thể được sử dụng; kết quả của biểu thức này sau đó được trả về.
(a, b, c) => a + b - c
function(a, b, c) { return a + b - c }
Một vi dụ khac:
(a, b, c) => (a + 1, b - 2 * c / 3)
function(a, b, c) { return (a + 1, b - 2 * c / 3) }
Một lần nữa, bạn có thể chỉ cần sao chép nguyên văn biểu thức - NHƯNG hãy cẩn thận rằng bạn không xuất ra ngắt dòng giữa nó và returntừ khóa để tránh tự động chèn dấu chấm phẩy!
Một lý lẽ
Dấu ngoặc là tùy chọn nếu một đối số được cung cấp.
foo => { return foo + 'bar' }
function(foo) { return foo + 'bar' }
Khoảng trắng
Cuối cùng, bạn phải có thể tính toán bất kỳ số lượng ký tự khoảng trắng (dấu cách, tab, dòng mới) trước hoặc sau dấu ngoặc đơn, biến, dấu phẩy, dấu ngoặc nhọn và mũi tên *.
( o , O
, _ )=>{
return "Please don't write code like this."
}
Việc bạn có chọn duy trì khoảng trắng trong đầu ra hay không là tùy thuộc vào bạn. Giữ chúng, xóa chúng hoặc thêm của riêng bạn - chỉ cần đảm bảo đó là mã hợp lệ!
* Về mặt kỹ thuật, việc một mũi tên xuất hiện ngay sau khi ngắt dòng là bất hợp pháp, nhưng tôi nghi ngờ thực tế này sẽ giúp bạn. :)
Một cách nhanh chóng để xác nhận đầu ra của bạn:
Nhập var foo = <your output>; foo()vào bảng điều khiển trình duyệt của bạn. Nếu nó không phàn nàn, có lẽ bạn đang đi đúng hướng.
Thêm quy tắc cho các pháp sư:
- Đầu vào là một hàm mũi tên ES6 hợp lệ về mặt cú pháp.
- Giả sử các cơ quan chức năng là ES5 tương thích (và không tham khảo
this,super,arguments, vv). Điều này cũng có nghĩa là hàm sẽ không bao giờ chứa hàm mũi tên khác (nhưng bạn có thể không cho rằng "=>" sẽ không bao giờ xảy ra trong cơ thể). - Tên biến sẽ chỉ bao gồm các chữ cái Latinh cơ bản,
$và_. - Bạn không cần phiên dịch các tính năng ES6 không được liệt kê ở trên (tham số mặc định, toán tử nghỉ, hủy bỏ, v.v.).
- Các không gian sau một
returntuyên bố là không bắt buộc nếu tiếp theo(,[hoặc{. - Không nhất thiết phải khớp chính xác các trường hợp thử nghiệm của tôi - bạn có thể sửa đổi mã nhiều như bạn cần nếu điều đó sẽ giúp giảm số byte của bạn. Thực sự, miễn là bạn tạo ra một biểu thức hàm ES5 có giá trị về mặt cú pháp, thì bạn là vàng!
a =>\na, nơi function(a){ return\na }thực sự sẽ trở lại undefinedbất kể giá trị của alà gì. Chúng ta có cần phải xử lý việc này không?
=>?