Tôi muốn tạo hệ thống ID tròn để tăng số được lưu trữ cuối cùng trong tệp JSON chỉ nếu một số lệnh được chạy. Có ai biết làm thế nào để làm điều đó không? Không thể tìm thấy giải pháp ...
function roundID[]{
for [var i = 0; i < client.roundID.length; i++] {
client.roundID[i];
console.log['there are' + i];
}
client.roundID [lastRoundID.toString[]] = {
roundid: '1',
player: message.author.tag
}
fs.writeFile ['roundID.json', JSON.stringify[client.roundID, null, 4], err => {
if [err] throw err;
}]
}
Cơ sở dữ liệu: [Tôi muốn nhận tổng số lượng đối số đầu tiên trong cơ sở dữ liệu
{
"1": {
"roundid": "1",
"player": "name"
},
"2": {
"roundid": "1",
"player": "name"
}
}
Trò chuyện với chúng tôi về JavaScript Tìm chúng tôi trên Gitter.: this guide assumes you are using Babel, and requires that you use babel-preset-airbnb or the equivalent. It also assumes
you are installing shims/polyfills in your app, with airbnb-browser-shims or the equivalent.
Tài liệu tham khảo
Người đóng góp
Xem những người đóng góp
- Giấy phép
- [Giấy phép MIT]
- CSS-in-JavaScript
- Bản quyền [c] 2012 Airbnb
- Quyền được cấp, miễn phí, cho bất kỳ ai có được bản sao phần mềm này và các tệp tài liệu liên quan ['phần mềm'], để giải quyết phần mềm mà không bị hạn chế, bao gồm không giới hạn quyền sử dụng, sao chép, sửa đổi, hợp nhất , Xuất bản, Phân phối, Bán cấp và/hoặc Bán các bản sao của phần mềm và cho phép những người mà phần mềm được cung cấp để làm như vậy, tuân theo các điều kiện sau:
Thông báo bản quyền trên và Thông báo quyền này sẽ được bao gồm trong tất cả các bản sao hoặc các phần đáng kể của phần mềm.
- Phần mềm được cung cấp 'như là', không có bảo hành dưới bất kỳ hình thức nào, rõ ràng hay ngụ ý, bao gồm nhưng không giới hạn trong các bảo đảm của thương mại, thể lực cho một mục đích cụ thể và không bị thiếu sót. Trong mọi trường hợp, các tác giả hoặc chủ bản quyền sẽ phải chịu trách nhiệm đối với bất kỳ khiếu nại, thiệt hại hoặc trách nhiệm nào khác, cho dù trong hành động của hợp đồng, tra tấn hay nói cách khác, phát sinh từ hoặc liên quan đến phần mềm hoặc việc sử dụng hoặc các giao dịch khác trong PHẦN MỀM.
- Sửa đổi
- Chúng tôi khuyến khích bạn đưa ra hướng dẫn này và thay đổi các quy tắc để phù hợp với hướng dẫn phong cách nhóm của bạn. Dưới đây, bạn có thể liệt kê một số sửa đổi cho hướng dẫn kiểu. Điều này cho phép bạn định kỳ cập nhật hướng dẫn phong cách của mình mà không phải đối phó với xung đột hợp nhất.
- };
- Hướng dẫn kiểu JavaScript Airbnb [] {
- Một cách tiếp cận chủ yếu hợp lý đối với JavaScript
- Lưu ý: Hướng dẫn này giả định rằng bạn đang sử dụng Babel và yêu cầu bạn sử dụng Babel-PRESET-AIRBNB hoặc tương đương. Nó cũng giả định rằng bạn đang cài đặt shims/polyfills trong ứng dụng của mình, với các shims trình duyệt Airbnb hoặc tương đương.
- Hướng dẫn này cũng có sẵn trong các ngôn ngữ khác. xem phiên dịch
- Hướng dẫn phong cách khác
- ES5 [không dùng nữa]
- Phản ứng
- CSS & Sass
- Ruby
- Mục lục
- Loại
- Người giới thiệu
- Các đối tượng
- Mảng
- Phá hủy
- Dây
- Chức năng
- Hàm mũi tên
- Các lớp & nhà xây dựng
- Mô -đun
- Tererators và máy phát điện
- Đặc tính
- Biến
- Kéo
- Các nhà khai thác và bình đẳng so sánh
- Khối
- Kiểm soát tuyên bố
- Bình luận
- Khoảng trắng
- Dịch
- Hướng dẫn kiểu JavaScript
- Trò chuyện với chúng tôi về JavaScript
- Người đóng góp
- Xem những người đóng góp
- Dịch
Phần mềm được cung cấp 'như là', không có bảo hành dưới bất kỳ hình thức nào, rõ ràng hay ngụ ý, bao gồm nhưng không giới hạn trong các bảo đảm của thương mại, thể lực cho một mục đích cụ thể và không bị thiếu sót. Trong mọi trường hợp, các tác giả hoặc chủ bản quyền sẽ phải chịu trách nhiệm đối với bất kỳ khiếu nại, thiệt hại hoặc trách nhiệm nào khác, cho dù trong hành động của hợp đồng, tra tấn hay nói cách khác, phát sinh từ hoặc liên quan đến phần mềm hoặc việc sử dụng hoặc các giao dịch khác trong PHẦN MỀM.
-
Sửa đổiPrimitives: When you access a primitive type you work directly on its value.
51{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
52{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
53{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
54{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
55{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
56{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
57{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
- Chúng tôi khuyến khích bạn đưa ra hướng dẫn này và thay đổi các quy tắc để phù hợp với hướng dẫn phong cách nhóm của bạn. Dưới đây, bạn có thể liệt kê một số sửa đổi cho hướng dẫn kiểu. Điều này cho phép bạn định kỳ cập nhật hướng dẫn phong cách của mình mà không phải đối phó với xung đột hợp nhất.
};Complex: When you access a complex type you work on a reference to its value.
58{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
59{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
60{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
⬆ Quay lại đầu
Sửa đổi
Chúng tôi khuyến khích bạn đưa ra hướng dẫn này và thay đổi các quy tắc để phù hợp với hướng dẫn phong cách nhóm của bạn. Dưới đây, bạn có thể liệt kê một số sửa đổi cho hướng dẫn kiểu. Điều này cho phép bạn định kỳ cập nhật hướng dẫn phong cách của mình mà không phải đối phó với xung đột hợp nhất.
};
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
Hướng dẫn kiểu JavaScript Airbnb [] {
Một cách tiếp cận chủ yếu hợp lý đối với JavaScript
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
Lưu ý: Hướng dẫn này giả định rằng bạn đang sử dụng Babel và yêu cầu bạn sử dụng Babel-PRESET-AIRBNB hoặc tương đương. Nó cũng giả định rằng bạn đang cài đặt shims/polyfills trong ứng dụng của mình, với các shims trình duyệt Airbnb hoặc tương đương.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
Hướng dẫn này cũng có sẵn trong các ngôn ngữ khác. xem phiên dịch
⬆ Quay lại đầu
Chúng tôi khuyến khích bạn đưa ra hướng dẫn này và thay đổi các quy tắc để phù hợp với hướng dẫn phong cách nhóm của bạn. Dưới đây, bạn có thể liệt kê một số sửa đổi cho hướng dẫn kiểu. Điều này cho phép bạn định kỳ cập nhật hướng dẫn phong cách của mình mà không phải đối phó với xung đột hợp nhất.
};
// bad const item = new Object[]; // good const item = {};
Hướng dẫn kiểu JavaScript Airbnb [] {
Tại sao? Chúng cho phép bạn xác định tất cả các thuộc tính của một đối tượng ở một nơi.
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
3.3 Sử dụng phương pháp đối tượng tốc ký. ESLINT:
80{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
3.4 Sử dụng giá trị tài sản tốc ký. ESLINT:
80{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Tại sao? Nó ngắn hơn và mô tả.
0{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
3.5 Nhóm thuộc tính tốc ký của bạn khi bắt đầu khai báo đối tượng của bạn.
Tại sao? Nó dễ dàng hơn để nói những thuộc tính nào đang sử dụng tốc ký.
1{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
3.6 Chỉ có các thuộc tính báo giá là định danh không hợp lệ. ESLINT:
82{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Tại sao? Nói chung, chúng tôi xem xét nó chủ quan dễ đọc hơn. Nó cải thiện sự nổi bật của cú pháp, và cũng dễ dàng được tối ưu hóa hơn bởi nhiều động cơ JS.
2{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
3.7 Không gọi các phương thức
83 trực tiếp, chẳng hạn như{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
84,{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
85 và{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
86. ESLINT:{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
87{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Tại sao? Các phương thức này có thể bị che mờ bởi các thuộc tính trên đối tượng trong câu hỏi - hãy xem xét
88 - hoặc, đối tượng có thể là một đối tượng null [{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
89].{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
3{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
3.8 Thích cú pháp lan truyền của đối tượng hơn
90 đến các đối tượng sao chép nông. Sử dụng cú pháp tham số REST đối tượng để có được một đối tượng mới với các thuộc tính nhất định bị bỏ qua. ESLINT:{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
91{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
Mảng
4.1 Sử dụng cú pháp theo nghĩa đen để tạo mảng. ESLINT:
92{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
5{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.2 Sử dụng Array#Push thay vì gán trực tiếp để thêm các mục vào một mảng.
6{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.3 Sử dụng chênh lệch mảng
93 để sao chép mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
7{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.4 Để chuyển đổi một đối tượng có thể lặp lại thành một mảng, sử dụng chênh lệch
93 thay vì{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
95{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
8{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.5 Sử dụng
95 để chuyển đổi một đối tượng giống như mảng thành một mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
9{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.6 Sử dụng
95 thay vì lan truyền{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
93 để ánh xạ qua Iterables, bởi vì nó tránh tạo ra một mảng trung gian.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
0
4.7 Sử dụng các câu lệnh trả về trong các cuộc gọi lại của phương thức mảng. Nó có thể bỏ qua sự trở lại nếu cơ thể hàm bao gồm một câu lệnh trả về một biểu thức không có tác dụng phụ, sau 8.2. ESLINT:
99{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
1
4.8 Sử dụng đường ngắt sau khi mở và trước khi đóng khung mảng nếu một mảng có nhiều dòng
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
2
⬆ Quay lại đầu
Mảng
4.1 Sử dụng cú pháp theo nghĩa đen để tạo mảng. ESLINT:
92{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.2 Sử dụng Array#Push thay vì gán trực tiếp để thêm các mục vào một mảng.
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
3
4.3 Sử dụng chênh lệch mảng
93 để sao chép mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
4
4.4 Để chuyển đổi một đối tượng có thể lặp lại thành một mảng, sử dụng chênh lệch
93 thay vì{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
95{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.5 Sử dụng
95 để chuyển đổi một đối tượng giống như mảng thành một mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
5
⬆ Quay lại đầu
Mảng
4.1 Sử dụng cú pháp theo nghĩa đen để tạo mảng. ESLINT:
92{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
6
4.2 Sử dụng Array#Push thay vì gán trực tiếp để thêm các mục vào một mảng.
4.3 Sử dụng chênh lệch mảng
93 để sao chép mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
7
4.4 Để chuyển đổi một đối tượng có thể lặp lại thành một mảng, sử dụng chênh lệch
93 thay vì{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
95{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.5 Sử dụng
95 để chuyển đổi một đối tượng giống như mảng thành một mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
8
- 4.6 Sử dụng
95 thay vì lan truyền{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
93 để ánh xạ qua Iterables, bởi vì nó tránh tạo ra một mảng trung gian.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.7 Sử dụng các câu lệnh trả về trong các cuộc gọi lại của phương thức mảng. Nó có thể bỏ qua sự trở lại nếu cơ thể hàm bao gồm một câu lệnh trả về một biểu thức không có tác dụng phụ, sau 8.2. ESLINT:
99{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.8 Sử dụng đường ngắt sau khi mở và trước khi đóng khung mảng nếu một mảng có nhiều dòng
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
9
⬆ Quay lại đầu
Mảng
4.1 Sử dụng cú pháp theo nghĩa đen để tạo mảng. ESLINT:
92{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
4.2 Sử dụng Array#Push thay vì gán trực tiếp để thêm các mục vào một mảng.
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
0
4.3 Sử dụng chênh lệch mảng
93 để sao chép mảng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Tại sao? Một biểu thức chức năng được gọi ngay lập tức là một đơn vị duy nhất - bao bọc cả nó và các parens gọi của nó, trong parens, thể hiện rõ ràng điều này. Lưu ý rằng trong một thế giới với các mô -đun ở khắp mọi nơi, bạn gần như không bao giờ cần một iife.
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
1
- 7.3 Không bao giờ khai báo một hàm trong một khối không chức năng [
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
11,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
12, v.v.]. Thay vào đó, gán chức năng cho một biến. Các trình duyệt sẽ cho phép bạn làm điều đó, nhưng tất cả chúng đều diễn giải nó khác nhau, đó là những tin tức xấu. ESLINT:const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
13
7.4 Lưu ý: ECMA-262 định nghĩa
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
14 là danh sách các câu lệnh. Một tuyên bố chức năng không phải là một tuyên bố.Note: ECMA-262 defines aconst foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
14 as a list of statements. A function declaration is not a statement.const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
2
7.5 Không bao giờ đặt tên cho một tham số
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
15. Điều này sẽ được ưu tiên hơn đối tượngconst foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
15 được trao cho mọi phạm vi chức năng.const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
3
7.6 Không bao giờ sử dụng
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
15, chọn sử dụng cú pháp REST
93 thay thế. ESLINT:{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
19Tại sao?
93 rõ ràng về những đối số bạn muốn kéo. Thêm vào đó, các đối số REST là một mảng thực sự, và không chỉ đơn thuần là giống như{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
15.const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
4
7.7 Sử dụng cú pháp tham số mặc định thay vì các đối số chức năng đột biến.
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
5
7.8 Tránh các tác dụng phụ với các tham số mặc định.
Tại sao? Họ khó hiểu để lý luận về.
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
6
7.9 Luôn đặt các tham số mặc định cuối cùng. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
22const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
7
7.10 Không bao giờ sử dụng hàm tạo hàm để tạo chức năng mới. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
23Tại sao? Tạo một chức năng theo cách này đánh giá một chuỗi tương tự như
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
06, mở các lỗ hổng.const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
8
7.11 Khoảng cách trong một chữ ký chức năng. ESLint:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
25const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
26Tại sao? Tính nhất quán là tốt, và bạn không nên thêm hoặc xóa một khoảng trống khi thêm hoặc xóa tên.
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
9
7.12 Không bao giờ đột biến các tham số. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
27Tại sao? Thao tác các đối tượng được truyền trong các tham số có thể gây ra các tác dụng phụ biến không mong muốn trong người gọi ban đầu.
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
0
7.13 Không bao giờ chỉ định lại các tham số. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
27Tại sao? Việc chỉ định lại các tham số có thể dẫn đến hành vi bất ngờ, đặc biệt là khi truy cập đối tượng
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
15. Nó cũng có thể gây ra các vấn đề tối ưu hóa, đặc biệt là trong V8.// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
1
7.14 Thích sử dụng cú pháp lan truyền
93 để gọi các hàm variadic. ESLINT:{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
31Tại sao? Nó sạch hơn, bạn không cần cung cấp một bối cảnh và bạn không thể dễ dàng soạn
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
32 vớiconst foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
33.// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
2
7.15 Các chức năng với chữ ký đa dòng hoặc các yêu cầu, nên được thụt vào giống như mọi danh sách đa dòng khác trong hướng dẫn này: với mỗi mục trên một dòng, với dấu phẩy kéo dài trên mục cuối cùng. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
34// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
3
⬆ Quay lại đầu
Hàm mũi tên
8.1 Khi bạn phải sử dụng hàm ẩn danh [như khi chuyển cuộc gọi lại nội tuyến], hãy sử dụng ký hiệu chức năng mũi tên. ESLint:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
35,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
36Tại sao? Nó tạo ra một phiên bản của hàm thực thi trong bối cảnh
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
37, thường là những gì bạn muốn và là một cú pháp ngắn gọn hơn.Tại sao không? Nếu bạn có một chức năng khá phức tạp, bạn có thể chuyển logic đó ra biểu thức chức năng được đặt tên của riêng nó.
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
4
8.2 Nếu cơ thể hàm bao gồm một câu lệnh trả về một biểu thức không có tác dụng phụ, hãy bỏ qua niềng răng và sử dụng lợi nhuận ngầm. Nếu không, hãy giữ niềng răng và sử dụng câu lệnh
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
38. ESLint:const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
39,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
40Tại sao? Cú pháp đặc biệt. Nó đọc tốt khi nhiều chức năng được xích lại với nhau.
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
5
8.3 Trong trường hợp biểu thức kéo dài trên nhiều dòng, hãy bọc nó trong ngoặc đơn để dễ đọc hơn.
Tại sao? Nó cho thấy rõ nơi chức năng bắt đầu và kết thúc.
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
6
8.4 Luôn bao gồm các dấu ngoặc đơn xung quanh các đối số cho sự rõ ràng và nhất quán. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
39Tại sao? Tối thiểu hóa khu vực khác khi thêm hoặc loại bỏ các đối số.
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
7
8.5 Tránh cú pháp chức năng mũi tên nhầm lẫn [
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
42] với các toán tử so sánh [const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
43,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
44]. ESLINT:const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
45// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
8
8.6 Thực thi vị trí của các cơ quan chức năng mũi tên có lợi nhuận ngầm. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
46// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
9
⬆ Quay lại đầu
Hàm mũi tên
8.1 Khi bạn phải sử dụng hàm ẩn danh [như khi chuyển cuộc gọi lại nội tuyến], hãy sử dụng ký hiệu chức năng mũi tên. ESLint:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
35,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
36Tại sao? Nó tạo ra một phiên bản của hàm thực thi trong bối cảnh
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
37, thường là những gì bạn muốn và là một cú pháp ngắn gọn hơn.// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
0
Tại sao không? Nếu bạn có một chức năng khá phức tạp, bạn có thể chuyển logic đó ra biểu thức chức năng được đặt tên của riêng nó.
8.2 Nếu cơ thể hàm bao gồm một câu lệnh trả về một biểu thức không có tác dụng phụ, hãy bỏ qua niềng răng và sử dụng lợi nhuận ngầm. Nếu không, hãy giữ niềng răng và sử dụng câu lệnh
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
38. ESLint:const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
39,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
40// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
1
Tại sao? Cú pháp đặc biệt. Nó đọc tốt khi nhiều chức năng được xích lại với nhau.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
2
8.3 Trong trường hợp biểu thức kéo dài trên nhiều dòng, hãy bọc nó trong ngoặc đơn để dễ đọc hơn.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
3
Tại sao? Nó cho thấy rõ nơi chức năng bắt đầu và kết thúc.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
4
9.6 Tránh các thành viên lớp học trùng lặp. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
55Tại sao? Các tuyên bố của thành viên lớp học trùng lặp sẽ âm thầm thích cái cuối cùng - có các bản sao gần như chắc chắn là một lỗi.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
5
9.7 Phương pháp lớp nên sử dụng
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
37 hoặc được thực hiện thành phương thức tĩnh trừ khi thư viện hoặc khung bên ngoài yêu cầu sử dụng các phương thức không tĩnh cụ thể. Là một phương thức thể hiện nên chỉ ra rằng nó hoạt động khác nhau dựa trên các thuộc tính của máy thu. ESLINT:const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
57// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
6
⬆ Quay lại đầu
Mô -đun
10.1 Luôn sử dụng các mô-đun [________ 258/________ 259] trên hệ thống mô-đun không chuẩn. Bạn luôn có thể chuyển sang hệ thống mô -đun ưa thích của mình.
Tại sao? Các mô -đun là tương lai, hãy để bắt đầu sử dụng tương lai ngay bây giờ.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
7
10.2 Không sử dụng nhập khẩu ký tự đại diện.
Tại sao? Điều này đảm bảo bạn có một xuất khẩu mặc định duy nhất.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
8
10.3 và không xuất trực tiếp từ nhập khẩu.
Tại sao? Mặc dù một lớp lót là súc tích, có một cách rõ ràng để nhập khẩu và một cách rõ ràng để xuất khẩu làm cho mọi thứ nhất quán.
// bad var count = 1; if [true] { count += 1; } // good, use the let. let count = 1; if [true] { count += 1; }
9
10.4 Chỉ nhập từ một đường dẫn ở một nơi. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
60Tại sao? Có nhiều dòng nhập từ cùng một đường dẫn có thể làm cho mã khó duy trì hơn.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
0
10.5 Không xuất khẩu ràng buộc đột biến. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
61Tại sao? Đột biến nên tránh nói chung, nhưng đặc biệt là khi xuất các ràng buộc có thể thay đổi. Mặc dù kỹ thuật này có thể cần thiết cho một số trường hợp đặc biệt, nói chung, chỉ nên xuất khẩu các tài liệu tham khảo không đổi.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
1
10.6 Trong các mô -đun với một lần xuất, thích xuất mặc định hơn xuất khẩu được đặt tên. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
62Tại sao? Để khuyến khích nhiều tệp hơn mà chỉ xuất khẩu một thứ, tốt hơn cho khả năng đọc và khả năng bảo trì.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
2
10.7 Đặt tất cả các tuyên bố không phải là người không chú ý. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
64Tại sao? Vì
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
58 được nâng lên, giữ tất cả chúng ở vị trí hàng đầu ngăn chặn hành vi đáng ngạc nhiên.// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
3
10.8 Nhập khẩu đa dòng phải được thụt vào giống như mảng đa dòng và chữ cái. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
66Tại sao? Niềng răng xoăn tuân theo các quy tắc thụt tương tự như mọi khối niềng răng xoăn khác trong hướng dẫn kiểu, cũng như dấu phẩy.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
4
10.9 DISALLOW Webpack Loader Cú pháp trong các câu lệnh nhập mô -đun. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
67Tại sao? Vì sử dụng cú pháp WebPack trong các kết hợp nhập mã vào một người đóng gói mô -đun. Thích sử dụng cú pháp Loader trong
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
68.// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
5
10.10 Không bao gồm các phần mở rộng tên tệp JavaScript ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
69Tại sao? Bao gồm các phần mở rộng ức chế tái cấu trúc và các chi tiết thực hiện mã cứng không phù hợp của mô -đun bạn đang nhập trong mỗi người tiêu dùng.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
6
⬆ Quay lại đầu
Mô -đun
10.1 Luôn sử dụng các mô-đun [________ 258/________ 259] trên hệ thống mô-đun không chuẩn. Bạn luôn có thể chuyển sang hệ thống mô -đun ưa thích của mình.
Tại sao? Các mô -đun là tương lai, hãy để bắt đầu sử dụng tương lai ngay bây giờ.
10.2 Không sử dụng nhập khẩu ký tự đại diện.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
7
Tại sao? Điều này đảm bảo bạn có một xuất khẩu mặc định duy nhất.
10.3 và không xuất trực tiếp từ nhập khẩu.
Tại sao? Mặc dù một lớp lót là súc tích, có một cách rõ ràng để nhập khẩu và một cách rõ ràng để xuất khẩu làm cho mọi thứ nhất quán.
10.4 Chỉ nhập từ một đường dẫn ở một nơi. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
60// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
8
⬆ Quay lại đầu
Tại sao? Có nhiều dòng nhập từ cùng một đường dẫn có thể làm cho mã khó duy trì hơn.
// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
0// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log[a]; // ReferenceError console.log[b]; // ReferenceError console.log[c]; // Prints 1
9
10.5 Không xuất khẩu ràng buộc đột biến. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
61// bad const item = new Object[]; // good const item = {};
0
Tại sao? Đột biến nên tránh nói chung, nhưng đặc biệt là khi xuất các ràng buộc có thể thay đổi. Mặc dù kỹ thuật này có thể cần thiết cho một số trường hợp đặc biệt, nói chung, chỉ nên xuất khẩu các tài liệu tham khảo không đổi.
// bad const item = new Object[]; // good const item = {};
1
⬆ Quay lại đầu
10.6 Trong các mô -đun với một lần xuất, thích xuất mặc định hơn xuất khẩu được đặt tên. ESLINT: const foo = 1;
let bar = foo;
bar = 9;
console.log[foo, bar]; // => 1, 9
62
Tại sao? Để khuyến khích nhiều tệp hơn mà chỉ xuất khẩu một thứ, tốt hơn cho khả năng đọc và khả năng bảo trì.
// bad const item = new Object[]; // good const item = {};
2
10.7 Đặt tất cả các tuyên bố không phải là người không chú ý. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
64Tại sao? Vì
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
58 được nâng lên, giữ tất cả chúng ở vị trí hàng đầu ngăn chặn hành vi đáng ngạc nhiên.// bad const item = new Object[]; // good const item = {};
3
10.8 Nhập khẩu đa dòng phải được thụt vào giống như mảng đa dòng và chữ cái. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
66Tại sao? Điều này rất hữu ích khi sau này bạn có thể cần gán một biến tùy thuộc vào một trong các biến được chỉ định trước đó.
// bad const item = new Object[]; // good const item = {};
4
13.4 Gán các biến trong đó bạn cần chúng, nhưng đặt chúng ở một nơi hợp lý.
Tại sao?
65 và{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
61 là phạm vi khối và không có chức năng.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
// bad const item = new Object[]; // good const item = {};
5
13.5 Bài tập biến biến chuỗi. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
08Tại sao? Chuỗi các bài tập biến tạo ra các biến toàn cầu ngầm.
// bad const item = new Object[]; // good const item = {};
6
13.6 Tránh sử dụng tăng và giảm đơn [
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
09,const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
10]. ESLINTconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
11Tại sao? Theo tài liệu ESLINT, các câu lệnh tăng và giảm không được chèn tự động và có thể gây ra các lỗi im lặng với các giá trị tăng hoặc giảm trong một ứng dụng. Nó cũng biểu cảm hơn để biến đổi các giá trị của bạn với các câu lệnh như
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
12 thay vìconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
13 hoặcconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
14. Việc loại bỏ các tuyên bố tăng và giảm không cho bạn cũng ngăn bạn khỏi các giá trị trước/trước khi phân phối trước, điều này cũng có thể gây ra hành vi bất ngờ trong các chương trình của bạn.// bad const item = new Object[]; // good const item = {};
7
13.7 Tránh các dòng trước hoặc sau
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
15 trong một bài tập. Nếu nhiệm vụ của bạn vi phạmconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
16, hãy bao quanh giá trị trong parens. ESLINTconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
17.Tại sao? LineBreaks xung quanh
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
15 có thể làm xáo trộn giá trị của một nhiệm vụ.// bad const item = new Object[]; // good const item = {};
8
13.8 Không cho phép các biến không sử dụng. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
19Tại sao? Các biến được khai báo và không được sử dụng ở bất cứ đâu trong mã rất có thể là một lỗi do tái cấu trúc không hoàn chỉnh. Các biến như vậy chiếm không gian trong mã và có thể dẫn đến sự nhầm lẫn của độc giả.
// bad const item = new Object[]; // good const item = {};
9
⬆ Quay lại đầu
Kéo
14.1
62 Tuyên bố được nâng lên trên đỉnh của phạm vi chức năng bao quanh gần nhất của chúng, nhiệm vụ của họ thì không.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
61 và{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
65 Tuyên bố được ban phước với một khái niệm mới gọi là vùng chết tạm thời [TDZ]. Nó rất quan trọng để biết tại sao typeof không còn an toàn.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
0
14.2 Biểu thức chức năng ẩn danh nâng tên biến của họ, nhưng không phải là gán chức năng.
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
1
14.3 Biểu thức chức năng được đặt tên nâng tên biến, không phải tên hàm hoặc cơ thể hàm.
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
2
14.4 Tuyên bố chức năng Tăng tên của họ và cơ thể chức năng.
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
3Để biết thêm thông tin, hãy tham khảo phạm vi JavaScript & Hoisting của Ben Cherry.
⬆ Quay lại đầu
Kéo
- 14.1
62 Tuyên bố được nâng lên trên đỉnh của phạm vi chức năng bao quanh gần nhất của chúng, nhiệm vụ của họ thì không.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
61 và{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
65 Tuyên bố được ban phước với một khái niệm mới gọi là vùng chết tạm thời [TDZ]. Nó rất quan trọng để biết tại sao typeof không còn an toàn.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
14.2 Biểu thức chức năng ẩn danh nâng tên biến của họ, nhưng không phải là gán chức năng.
- 14.3 Biểu thức chức năng được đặt tên nâng tên biến, không phải tên hàm hoặc cơ thể hàm. evaluate to true
- 14.4 Tuyên bố chức năng Tăng tên của họ và cơ thể chức năng. evaluates to false
- Để biết thêm thông tin, hãy tham khảo phạm vi JavaScript & Hoisting của Ben Cherry. evaluates to false
- Các nhà khai thác và bình đẳng so sánh evaluate to the value of the boolean
- 15.1 Sử dụng
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
23 vàconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
24 trênconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
25 vàconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
26. ESLINT:const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
27 evaluate to false if +0, -0, or NaN, otherwise true - 15.2 Các câu lệnh có điều kiện như tuyên bố
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
11 Đánh giá biểu thức của họ bằng cách sử dụng sự ép buộc với phương pháp trừu tượngconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
29 và luôn tuân theo các quy tắc đơn giản sau: evaluate to false if an empty stringconst foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
02, otherwise true
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
4
Các đối tượng đánh giá đúng
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
5
- Đánh giá không xác định là sai
Null đánh giá là sai
Booleans đánh giá theo giá trị của boolean
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
6
Các số đánh giá là sai if +0, -0 hoặc nan, nếu không thì đúng
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
7
Chuỗi đánh giá sai nếu một chuỗi trống
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
02, nếu không đúngfunction getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
8
15.3 Sử dụng các phím tắt cho Booleans, nhưng so sánh rõ ràng cho các chuỗi và số.
15.4 Để biết thêm thông tin, hãy xem sự thật bình đẳng và JavaScript của Angus Croll.
function getKey[k] { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey['enabled']] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey['enabled']]: true, };
9
⬆ Quay lại đầu
Kéo
14.1
62 Tuyên bố được nâng lên trên đỉnh của phạm vi chức năng bao quanh gần nhất của chúng, nhiệm vụ của họ thì không.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
61 và{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
65 Tuyên bố được ban phước với một khái niệm mới gọi là vùng chết tạm thời [TDZ]. Nó rất quan trọng để biết tại sao typeof không còn an toàn.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
0
14.2 Biểu thức chức năng ẩn danh nâng tên biến của họ, nhưng không phải là gán chức năng.
// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
1
14.3 Biểu thức chức năng được đặt tên nâng tên biến, không phải tên hàm hoặc cơ thể hàm.
// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
2
⬆ Quay lại đầu
Kiểm soát tuyên bố
17.1 Trong trường hợp tuyên bố kiểm soát của bạn [
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
11,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
12, v.v.] quá dài hoặc vượt quá độ dài dòng tối đa, mỗi điều kiện [được nhóm] có thể được đưa vào một dòng mới. Toán tử logic nên bắt đầu dòng.Tại sao? Yêu cầu các toán tử ở đầu dòng giữ cho các toán tử được căn chỉnh và tuân theo một mẫu tương tự như chuỗi phương pháp. Điều này cũng cải thiện khả năng đọc bằng cách làm cho nó dễ dàng hơn để tuân theo logic phức tạp.
// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
3
17.2 Không sử dụng các toán tử lựa chọn thay cho các câu lệnh kiểm soát.
// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
4
⬆ Quay lại đầu
Bình luận
18.1 Sử dụng
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
66 cho các bình luận đa dòng.// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
5
18.2 Sử dụng
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
67 cho các bình luận dòng đơn. Đặt ý kiến dòng đơn trên một dòng mới trên chủ đề của bình luận. Đặt một dòng trống trước bình luận trừ khi nó trên dòng đầu tiên của một khối.// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
6
18.3 Bắt đầu tất cả các bình luận với một không gian để dễ đọc hơn. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
68// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
7
- 18.4 Tiền tố nhận xét của bạn với
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
69 hoặcconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
70 giúp các nhà phát triển khác nhanh chóng hiểu nếu bạn chỉ ra một vấn đề cần được xem xét lại, hoặc nếu bạn đề xuất một giải pháp cho vấn đề cần được thực hiện. Đây là khác nhau so với bình luận thường xuyên vì chúng có thể hành động. Các hành động làconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
71 hoặcconst foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
72.
-
18,5 Sử dụng
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
73 để chú thích các vấn đề.// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
8
18.6 Sử dụng
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
74 để chú thích các giải pháp cho các vấn đề.// bad const atom = { value: 1, addValue: function [value] { return atom.value + value; }, }; // good const atom = { value: 1, addValue[value] { return atom.value + value; }, };
9
⬆ Quay lại đầu
Khoảng trắng
19.1 Sử dụng các tab mềm [ký tự không gian] đặt thành 2 khoảng trắng. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
75
00{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.2 Đặt 1 không gian trước khi nẹp hàng đầu. ESLINT:
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
26
01{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.3 Đặt 1 không gian trước dấu ngoặc đơn mở trong các câu lệnh kiểm soát [
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
11,const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
12, v.v.]. Không có khoảng trống giữa danh sách đối số và tên hàm trong các cuộc gọi và khai báo chức năng. ESLINT:const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
79
02{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.4 Đặt ra các toán tử với không gian. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
80
03{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.5 Tệp kết thúc với một ký tự dòng duy nhất. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
81
04{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
05{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
06{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.6 Sử dụng thụt vào khi tạo chuỗi phương pháp dài [hơn 2 chuỗi phương pháp]. Sử dụng một dấu chấm hàng đầu, trong đó nhấn mạnh rằng dòng là một cuộc gọi phương thức, không phải là một tuyên bố mới. ESLint:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
82const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
83
07{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.7 Để lại một dòng trống sau các khối và trước câu lệnh tiếp theo.
08{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.8 Không đệm các khối của bạn bằng các đường trống. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
84
09{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.9 Không sử dụng nhiều dòng trống để đệm mã của bạn. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
85
10{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.10 Không thêm khoảng trống bên trong dấu ngoặc đơn. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
86
11{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.11 Không thêm khoảng trống bên trong ngoặc. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
87
12{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.12 Thêm khoảng trống bên trong niềng răng xoăn. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
88
13{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.13 Tránh có các dòng mã dài hơn 100 ký tự [bao gồm cả khoảng trắng]. LƯU Ý: Theo trên, các chuỗi dài được miễn trừ khỏi quy tắc này và không nên bị phá vỡ. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
16Tại sao? Điều này đảm bảo khả năng đọc và khả năng bảo trì.
14{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.14 Yêu cầu khoảng cách nhất quán bên trong mã thông báo khối mở và mã thông báo tiếp theo trên cùng một dòng. Quy tắc này cũng thực thi khoảng cách nhất quán bên trong một mã thông báo khối gần và mã thông báo trước đó trên cùng một dòng. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
90
15{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.15 Tránh không gian trước dấu phẩy và yêu cầu một không gian sau dấu phẩy. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
91
16{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19.16 Thực thi khoảng cách bên trong các giá đỡ tài sản được tính toán. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
92
17{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19,17 Tránh không gian giữa các chức năng và các yêu cầu của chúng. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
93
18{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
19,18 Thực thi khoảng cách giữa các khóa và giá trị trong các thuộc tính theo nghĩa đen của đối tượng. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
94
19{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
- 19.19 Tránh các không gian kéo dài ở cuối dòng. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
95
19.20 Tránh nhiều dòng trống, chỉ cho phép một dòng mới ở cuối tệp và tránh một dòng mới ở đầu các tệp. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
85
20{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
Dấu phẩy
20.1 Dấu phẩy hàng đầu: Không. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
97Nope. eslint:const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
97
21{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
20.2 Bổ sung dấu phẩy: Yup. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
98Yup. eslint:const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
98Tại sao? Điều này dẫn đến Git Cleaner Diffs. Ngoài ra, những người chuyển đổi như Babel sẽ loại bỏ dấu phẩy kéo dài trong mã được chuyển đổi, điều đó có nghĩa là bạn không phải lo lắng về vấn đề dấu phẩy kéo dài trong các trình duyệt kế thừa.
22{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
23{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
Dấu chấm phẩy
21,1 yup. ESLINT:
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
99Yup. eslint:const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log[foo[0], bar[0]]; // => 9, 9
99Tại sao? Khi JavaScript gặp phải một dòng phá vỡ mà không có dấu chấm phẩy, nó sử dụng một tập hợp các quy tắc gọi là chèn dấu chấm phẩy tự động để xác định xem nó có nên liên quan đến dòng đó là kết thúc của một câu lệnh hay không và [như tên ngụ ý] đặt một dấu chấm phẩy vào mã của bạn trước đó Các dòng phá vỡ nếu nó nghĩ như vậy. Tuy nhiên, ASI chứa một vài hành vi lập dị, và mã của bạn sẽ bị phá vỡ nếu JavaScript giải thích sai dòng của bạn. Các quy tắc này sẽ trở nên phức tạp hơn khi các tính năng mới trở thành một phần của JavaScript. Việc chấm dứt rõ ràng các tuyên bố của bạn và định cấu hình linter của bạn để bắt các dấu chấm phẩy bị thiếu sẽ giúp ngăn bạn gặp sự cố.
24{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Đọc thêm.
⬆ Quay lại đầu
Nhập đúc & ép buộc
- 22.1 Thực hiện ép buộc loại khi bắt đầu tuyên bố.
22.2 Chuỗi: ESLINT:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
00
25{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22.3 Số: Sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
01 cho loại đúc và// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
02 luôn có radix cho các chuỗi phân tích cú pháp. ESLint:// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
03// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
00Tại sao? Hàm
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
02 tạo ra giá trị số nguyên được quyết định bằng cách giải thích nội dung của đối số chuỗi theo radix được chỉ định. Khoảng trắng hàng đầu trong chuỗi bị bỏ qua. Nếu radix là
55 hoặc{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
07, thì nó được cho là// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
08 trừ khi số bắt đầu với các cặp ký tự// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
09 hoặc// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
10, trong trường hợp đó, Radix là 16 được giả định. Điều này khác với Ecmascript 3, chỉ đơn thuần là không khuyến khích [nhưng cho phép] diễn giải octal. Nhiều triển khai đã không áp dụng hành vi này vào năm 2013. Và, vì các trình duyệt cũ hơn phải được hỗ trợ, luôn chỉ định một radix.
26{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22.4 Nếu vì bất kỳ lý do gì bạn đang làm điều gì đó hoang dã và
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
02 là nút cổ chai của bạn và cần sử dụng Bitshift vì lý do hiệu suất, hãy để lại nhận xét giải thích lý do tại sao và những gì bạn làm.
27{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22,5 Lưu ý: Hãy cẩn thận khi sử dụng các hoạt động Bitshift. Các số được biểu diễn dưới dạng giá trị 64 bit, nhưng các hoạt động BitShift luôn trả về một số nguyên 32 bit [nguồn]. Bitshift có thể dẫn đến hành vi bất ngờ đối với các giá trị số nguyên lớn hơn 32 bit. Thảo luận. Lớn nhất đã ký 32 bit INT là 2.147.483.647:Note: Be careful when using bitshift operations. Numbers are represented as 64-bit values, but bitshift operations always return a 32-bit integer [source]. Bitshift can lead to unexpected behavior for integer values larger than 32 bits. Discussion. Largest signed 32-bit Int is 2,147,483,647:
28{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22.6 Booleans: Eslint:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
00
29{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
Nhập đúc & ép buộc
22.1 Thực hiện ép buộc loại khi bắt đầu tuyên bố.
30{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22.2 Chuỗi: ESLINT:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
00
31{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22.3 Số: Sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
01 cho loại đúc và// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
02 luôn có radix cho các chuỗi phân tích cú pháp. ESLint:// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
03// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
00
32{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Tại sao? Hàm
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
02 tạo ra giá trị số nguyên được quyết định bằng cách giải thích nội dung của đối số chuỗi theo radix được chỉ định. Khoảng trắng hàng đầu trong chuỗi bị bỏ qua. Nếu radix là
55 hoặc{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
07, thì nó được cho là// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
08 trừ khi số bắt đầu với các cặp ký tự// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
09 hoặc// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
10, trong trường hợp đó, Radix là 16 được giả định. Điều này khác với Ecmascript 3, chỉ đơn thuần là không khuyến khích [nhưng cho phép] diễn giải octal. Nhiều triển khai đã không áp dụng hành vi này vào năm 2013. Và, vì các trình duyệt cũ hơn phải được hỗ trợ, luôn chỉ định một radix.22.4 Nếu vì bất kỳ lý do gì bạn đang làm điều gì đó hoang dã và
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
02 là nút cổ chai của bạn và cần sử dụng Bitshift vì lý do hiệu suất, hãy để lại nhận xét giải thích lý do tại sao và những gì bạn làm.
33{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22,5 Lưu ý: Hãy cẩn thận khi sử dụng các hoạt động Bitshift. Các số được biểu diễn dưới dạng giá trị 64 bit, nhưng các hoạt động BitShift luôn trả về một số nguyên 32 bit [nguồn]. Bitshift có thể dẫn đến hành vi bất ngờ đối với các giá trị số nguyên lớn hơn 32 bit. Thảo luận. Lớn nhất đã ký 32 bit INT là 2.147.483.647:
34{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
22.6 Booleans: Eslint:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
00
35{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Đặt tên quy ước
36{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
23.1 Tránh tên chữ cái đơn. Được mô tả với việc đặt tên của bạn. ESLINT:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
13
37{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
23.2 Sử dụng Camelcase khi đặt tên đối tượng, chức năng và phiên bản. ESLINT:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
1423.3 Chỉ sử dụng pascalcase khi đặt tên cho các hàm tạo hoặc lớp. ESLINT:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
15
38{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
23.4 Không sử dụng dấu gạch dưới hoặc dẫn đầu. ESLINT:
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
16Tại sao? JavaScript không có khái niệm về quyền riêng tư về các thuộc tính hoặc phương thức. Mặc dù một dấu gạch dưới hàng đầu là một quy ước phổ biến có nghĩa là riêng tư, nhưng trên thực tế, các tài sản này hoàn toàn công khai và như vậy, là một phần của hợp đồng API công khai của bạn. Công ước này có thể khiến các nhà phát triển nghĩ sai rằng một sự thay đổi đã giành được tính toán là phá vỡ, hoặc các thử nghiệm đó không cần thiết. TL; DR: Nếu bạn muốn một cái gì đó trở thành riêng tư, thì nó không thể có mặt một cách quan sát.
- 23.5 Don Tiết lưu tài liệu tham khảo đến
const foo = 1; let bar = foo; bar = 9; console.log[foo, bar]; // => 1, 9
37. Sử dụng các hàm mũi tên hoặc chức năng#BIND. - 23.6 Một tên tệp cơ sở nên khớp chính xác với tên xuất khẩu mặc định của nó.
39{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
- 23.5 Don Tiết lưu tài liệu tham khảo đến
⬆ Quay lại đầu
23.7 Sử dụng Camelcase khi bạn xuất D-Default một chức năng. Tên tệp của bạn phải giống hệt với tên chức năng của bạn.
- 23.8 Sử dụng pascalcase khi bạn xuất một hàm tạo / lớp / singleton / thư viện chức năng / đối tượng trần.
23.9 Các từ viết tắt và khởi tạo phải luôn luôn được sử dụng, hoặc tất cả đều bị hạ thấp.
40{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Tại sao? Tên là cho khả năng đọc, không để xoa dịu thuật toán máy tính.
41{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
23.10 Bạn có thể sử dụng ở dưới một hằng số chỉ khi nó [1] được xuất, [2] là một
61 [không thể được chỉ định lại] và [3] lập trình viên có thể tin tưởng nó [và các thuộc tính lồng nhau của nó] để không bao giờ thay đổi.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
42{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
Tại sao? Đây là một công cụ bổ sung để hỗ trợ trong các tình huống mà lập trình viên sẽ không chắc chắn nếu một biến có thể thay đổi. Uppercase_variables đang cho người lập trình biết rằng họ có thể tin tưởng biến [và các thuộc tính của nó] không thay đổi.
Còn tất cả các biến
61 thì sao? - Điều này là không cần thiết, vì vậy không nên sử dụng từ trên cao cho các hằng số trong một tệp. Tuy nhiên, nó nên được sử dụng cho các hằng số xuất khẩu.{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
43{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
prefer:
44{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
jQuery
26.1 Các biến đối tượng jQuery tiền tố với
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
28.
45{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
26.2 Tra cứu JQuery Cache.
46{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
- 26.3 Đối với các truy vấn dom sử dụng xếp tầng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
29 hoặc cha mẹ> con// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
30. JSperf
26.4 Sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
31 với các truy vấn đối tượng jQuery phạm vi.
47{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
jQuery
- 26.1 Các biến đối tượng jQuery tiền tố với
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
28.
⬆ Quay lại đầu
jQuery
- 26.1 Các biến đối tượng jQuery tiền tố với
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
28.
- 26.2 Tra cứu JQuery Cache.
- 26.3 Đối với các truy vấn dom sử dụng xếp tầng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
29 hoặc cha mẹ> con// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
30. JSperf - 26.4 Sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
31 với các truy vấn đối tượng jQuery phạm vi. - Khả năng tương thích Ecmascript 5
- 27.1 Tham khảo bảng tương thích Kangax từ ES5.
- Phong cách Ecmascript 6+ [ES 2015+]
- 28.1 Đây là một tập hợp các liên kết đến các tính năng ES6+ khác nhau.
- Hàm mũi tên
- Các lớp học
- Đối tượng tốc ký
- Đối tượng ngắn gọn
- Đối tượng tính toán thuộc tính
- Chuỗi mẫu
- Phá hủy
Tham số mặc định
Lên đỉnh
⬆ Quay lại đầu
Mảng lan rộng
Cho phép và const
Toán tử số mũ
Tererators và máy phát điện
48{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
Mô -đun
28.2 Không sử dụng các đề xuất TC39 chưa đạt đến Giai đoạn 3.
49{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
⬆ Quay lại đầu
Tại sao? Chúng không được hoàn thành, và chúng có thể thay đổi hoặc bị rút hoàn toàn. Chúng tôi muốn sử dụng JavaScript và các đề xuất chưa phải là JavaScript.
Thư viện tiêu chuẩnYup.
50{ "1": { "roundid": "1", "player": "name" }, "2": { "roundid": "1", "player": "name" }
- Thư viện tiêu chuẩn chứa các tiện ích bị phá vỡ về mặt chức năng nhưng vẫn vì lý do di sản.No, but seriously:
- 29.1 Sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
32 thay vì toàn cầu// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
33. ESLINT:// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
34 - Tại sao? Toàn cầu
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
33 ép buộc những người không phải là số lượng, trả lại sự thật cho bất cứ điều gì ép buộc với Nan. Nếu hành vi này là mong muốn, hãy làm cho nó rõ ràng. - 29.2 Sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
36 thay vì toàn cầu// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
37. ESLINT:// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
34 - Tại sao? Toàn cầu
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
37 ép buộc các số không thành số, trả lại đúng với bất cứ điều gì ép buộc với một số hữu hạn. Nếu hành vi này là mong muốn, hãy làm cho nó rõ ràng. - Kiểm tra
- 30,1 yup.
- 29.1 Sử dụng
⬆ Quay lại đầu
30.2 Không, nhưng nghiêm túc:
- Bất kỳ khung thử nghiệm nào bạn sử dụng, bạn nên viết bài kiểm tra!
- Phấn đấu để viết nhiều chức năng thuần túy nhỏ và giảm thiểu nơi xảy ra đột biến.
- Hãy thận trọng về các cuống và giả - chúng có thể làm cho các bài kiểm tra của bạn dễ vỡ hơn.
- Chúng tôi chủ yếu sử dụng
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
40 và// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
41 tại Airbnb.// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
42 đôi khi cũng được sử dụng cho các mô -đun nhỏ, riêng biệt. - Bảo hiểm thử nghiệm 100% là một mục tiêu tốt để phấn đấu, ngay cả khi nó không phải lúc nào cũng thực tế để đạt được nó.
- Bất cứ khi nào bạn sửa lỗi, hãy viết bài kiểm tra hồi quy. Một lỗi cố định mà không có bài kiểm tra hồi quy gần như chắc chắn sẽ bị phá vỡ trong tương lai.
- Màn biểu diễn
- Trên Bố cục & Hiệu suất Web
- Loading...
⬆ Quay lại đầu
Chuỗi vs mảng concat
Thử/bắt chi phí trong một vòng lặp
- Chức năng bang
- jQuery tìm vs bối cảnh, bộ chọn
- Intern
- Kết hợp chuỗi dài
Các hàm JavaScript như const foo = 1;
let bar = foo;
bar = 9;
console.log[foo, bar]; // => 1, 9
74, const foo = 1;
let bar = foo;
bar = 9;
console.log[foo, bar]; // => 1, 9
79 và const foo = 1;
let bar = foo;
bar = 9;
console.log[foo, bar]; // => 1, 9
76 được tối ưu hóa cho các mảng đi qua?
- Tài nguyên
Học es6+
- Thông số kỹ thuật ECMA mới nhất
- Khám pháJS
- Bảng tương thích ES6
- Tổng quan toàn diện về các tính năng ES6
Đọc này
- ECMA-262 tiêu chuẩn
- Công cụ
- Mã phong cách linters
- ESLint - Airbnb Style .eslintrc
- JSHINT - Phong cách Airbnb .Jshintrc
Neutrino preset - @neutrinojs/airbnb
- Hướng dẫn phong cách khác
- Hướng dẫn kiểu google javascript
- Hướng dẫn kiểu Google JavaScript [cũ]
- Hướng dẫn phong cách cốt lõi của JQuery
Nguyên tắc viết JavaScript phù hợp, thành ngữ
- StandardJS
- Phong cách khác
- Đặt tên này trong các chức năng lồng nhau - Christian Johansen
- Gọi lại có điều kiện - Ross Allen
- Các quy ước mã hóa JavaScript phổ biến trên Github - Jeonghoon Byun
Nhiều tuyên bố VAR trong JavaScript, không thừa - Ben Alman
- Đọc thêm
- Hiểu về đóng cửa JavaScript - Angus Croll
- JavaScript cơ bản cho lập trình viên thiếu kiên nhẫn - Tiến sĩ Axel Rauschmayer
- Bạn có thể không cần JQuery - Zack Bloom & Adam Schwartz
- Tính năng ES6 - Luke Hoban
- Hướng dẫn phía trước - Benjamin de Cock
- Sách
- JavaScript: Phần tốt - Douglas Crockford
- Mẫu JavaScript - Stoyan Stefanov
- Các mẫu thiết kế JavaScript Pro - Ross Harmes và Dustin Diaz
- Trang web hiệu suất cao: Kiến thức cần thiết cho các kỹ sư mặt trước - Steve Souders
- JavaScript có thể duy trì - Nicholas C. Zakas
- Ứng dụng web JavaScript - Alex Maccaw
- Kỹ thuật JavaScript Pro - John Resig
- Smashing Node.js: JavaScript ở khắp mọi nơi - Guillermo Rauch
- Bí mật của Ninja JavaScript - John Resig và Bear Bibeault
JavaScript của con người - Henrik Joreteg
- Superhero.js - Kim Joar Bekkelund, Mads Mobæk, & Olav Bjorkoy
- JSbooks - Julien Bouquillon
- JavaScript của bên thứ ba - Ben Vinegar và Anton Kovalyov
- JavaScript hiệu quả: 68 cách cụ thể để khai thác sức mạnh của JavaScript - David Herman
- JavaScript hùng hồn - Marijn Haverbeke
- Bạn không biết JS: ES6 & Beyond - Kyle Simpson
- Blog
- JavaScript hàng tuần
- JavaScript, JavaScript ...
Bocoup weblog
- Đầy đủ tốt
- Nczonline
⬆ Quay lại đầu
Sự hoàn hảo giết chết
Ben Alman
- 123erfasst: 123erfasst/javascript: 123erfasst/javascript
- 4catalyzer: 4catalyzer/javascript: 4Catalyzer/javascript
- Aan Zee: Aanzee/JavaScript: AanZee/javascript
- Airbnb: Airbnb/JavaScript: airbnb/javascript
- Alopeyk: Alopeyk: AloPeyk
- Altschool: Altschool/JavaScript: AltSchool/javascript
- ApartMint: ApartMint/JavaScript: apartmint/javascript
- Ghế quy định: ascribe/javascript: ascribe/javascript
- Avant: Avantcredit/JavaScript: avantcredit/javascript
- Axept: Axept/JavaScript: axept/javascript
- Billabong: Billabong/JavaScript: billabong/javascript
- Bisk: Bisk: bisk
- Bonhomme: Bonhommeparis/JavaScript: bonhommeparis/javascript
- BrainShark: BrainShark/JavaScript: brainshark/javascript
- Casenine: Casenine/JavaScript: CaseNine/javascript
- Cerner: Cerner: Cerner
- Chartboost: Hướng dẫn theo kiểu Chartboost/JavaScript: ChartBoost/javascript-style-guide
- Coeur D'Alene Tribe: www.cdatribe-nsn.gov: www.cdatribe-nsn.gov
- CAMESAONLINE: CAMESAONLINE/JavaScript: comparaonline/javascript
- Học la bàn: Hướng dẫn theo kiểu la bàn/theo kiểu JavaScript: compasslearning/javascript-style-guide
- Dailymotion: Dailymotion/JavaScript: dailymotion/javascript
- Dosome: DoSomething/eslint-config
- DigitPaint DigitPaint/JavaScript digitpaint/javascript
- Drupal: www.drupal.org: www.drupal.org
- Ecosia: Ecosia/JavaScript: ecosia/javascript
- Evernote: Evernote/JavaScript Style-Guide: evernote/javascript-style-guide
- Gaming Evolution: Evolution-Gaming/JavaScript: evolution-gaming/javascript
- Evozonjs: Evozonjs/JavaScript: evozonjs/javascript
- ExcactTarget: excittarget/javaScript: ExactTarget/javascript
- Flexberry: Flexberry/JavaScript Style-Guide: Flexberry/javascript-style-guide
- Gawker Media: Gawkermedia: gawkermedia
- General Electric: Generalelectric/JavaScript: GeneralElectric/javascript
- TUX thế hệ: Thế hệTux/JavaScript: GenerationTux/javascript
- Gooddata: Gooddata/GDC-JS theo phong cách: gooddata/gdc-js-style
- GreenChef: GreenChef/JavaScript: greenchef/javascript
- Grooveshark: Grooveshark/JavaScript: grooveshark/javascript
- Grupo-Abraxas: Grupo-Abraxas/JavaScript: Grupo-Abraxas/javascript
- Happeo: Happeo/JavaScript: happeo/javascript
- Mật ong: Honeyscience/JavaScript: honeyscience/javascript
- Làm thế nào về chúng tôi: Howaboutwe/JavaScript: howaboutwe/javascript
- HubSpot: HubSpot/JavaScript: HubSpot/javascript
- Hyper: Hyperoslo/JavaScript-Playbook: hyperoslo/javascript-playbook
- Nhóm liên tỉnh: Hướng dẫn theo kiểu Intercitygroup/JavaScript: intercitygroup/javascript-style-guide
- JAM3: JAVASCRIPT-Code Conventions: Jam3/Javascript-Code-Conventions
- JSSsolutions: JSSolutions/JavaScript: JSSolutions/javascript
- Kaplan Komputing: Kaplankomputing/JavaScript: kaplankomputing/javascript
- Kickorstick: Kickorstick: kickorstick
- Giải pháp động học: Kinetica/JavaScript: kinetica/javascript
- Leinwand: Leinwand/JavaScript: LEINWAND/javascript
- Hành tinh cô đơn: Lonelyplanet/JavaScript: lonelyplanet/javascript
- M2Gen: M2Gen/JavaScript: M2GEN/javascript
- Mùa xuân hùng mạnh: Mightyspring/JavaScript: mightyspring/javascript
- MINNPOST: MINNPOST/JavaScript: MinnPost/javascript
- Mitocgroup: Mitocgroup/JavaScript: MitocGroup/javascript
- Muber: Muber: muber
- Hiệp hội Địa lý Quốc gia: Natgeosociety: natgeosociety
- NULLDEV:: NullDevCo/JavaScript-Styleguide
- Nulogy: Nulogy/JavaScript: nulogy/javascript
- Orange Hill Development: Orangehill/JavaScript: orangehill/javascript
- Sức khỏe Orion: Orionhealth/JavaScript: orionhealth/javascript
- Peerby: Peerby/JavaScript: Peerby/javascript
- Cầu tàu 1: Pier1/JavaScript: Pier1/javascript
- Qotto: Hướng dẫn theo phong cách Qotto/JavaScript: Qotto/javascript-style-guide
- React: Reactjs.org/docs/how-to-contribution.html#style-guide: reactjs.org/docs/how-to-contribute.html#style-guide
- REI: Hướng dẫn theo phong cách REIDEV/JS: reidev/js-style-guide
- Ripple: Hướng dẫn theo phong cách Ripple/JavaScript: ripple/javascript-style-guide
- Siêu thị Sainsbury: Jsainsburyplc: jsainsburyplc
- Shutterfly: Shutterfly/JavaScript: shutterfly/javascript
- Sourcetoad: Sourcetoad/JavaScript: sourcetoad/javascript
- Lò xo: lò xo: springload
- Stratodem Analytics: Stratodem/JavaScript: stratodem/javascript
- Phát triển Steelkiwi: Steelkiwi/JavaScript: steelkiwi/javascript
- Sinh viên: Sinh viên/JavaScript: studentsphere/javascript
- SwoopApp: SwoopApp/JavaScript: swoopapp/javascript
- Sysgarage: Sysgarage/JavaScript Style-Guide: sysgarage/javascript-style-guide
- Syzygy Warsaw: Syzygypl/JavaScript: syzygypl/javascript
- Target: Target/JavaScript: target/javascript
- Terra: Terra: terra
- Theladders: Theladder/JavaScript: TheLadders/javascript
- The Nerdery: Thenerdery/JavaScript-Stards: thenerdery/javascript-standards
- Tomify: Tomprats: tomprats
- Traitify: Traitify/Eslint-Config Traitify: traitify/eslint-config-traitify
- Công nghệ T4R: T4R-Technology/JavaScript: T4R-Technology/javascript
- Urbansim: Urbansim: urbansim
- VOXFEED: Hướng dẫn theo phong cách Voxfeed/JavaScript: VoxFeed/javascript-style-guide
- Webox Studio: WeBoxStudio/JavaScript: weboxstudio/javascript
- Weggo: Weggo/JavaScript: Weggo/javascript
- Zvel: Zvel/JavaScript: zillow/javascript
- ZocDoc: ZocDoc/JavaScript: ZocDoc/javascript
⬆ Quay lại đầu
Dịch
Hướng dẫn kiểu này cũng có sẵn trong các ngôn ngữ khác:
Hướng dẫn kiểu JavaScript
- Tài liệu tham khảo
Trò chuyện với chúng tôi về JavaScript
- Tìm chúng tôi trên Gitter.
Người đóng góp
- Xem những người đóng góp
Giấy phép
[Giấy phép MIT]
Bản quyền [c] 2012 Airbnb
Quyền được cấp, miễn phí, cho bất kỳ ai có được bản sao phần mềm này và các tệp tài liệu liên quan ['phần mềm'], để giải quyết phần mềm mà không bị hạn chế, bao gồm không giới hạn quyền sử dụng, sao chép, sửa đổi, hợp nhất , Xuất bản, Phân phối, Bán cấp và/hoặc Bán các bản sao của phần mềm và cho phép những người mà phần mềm được cung cấp để làm như vậy, tuân theo các điều kiện sau:
Thông báo bản quyền trên và Thông báo quyền này sẽ được bao gồm trong tất cả các bản sao hoặc các phần đáng kể của phần mềm.
Phần mềm được cung cấp 'như là', không có bảo hành dưới bất kỳ hình thức nào, rõ ràng hay ngụ ý, bao gồm nhưng không giới hạn trong các bảo đảm của thương mại, thể lực cho một mục đích cụ thể và không bị thiếu sót. Trong mọi trường hợp, các tác giả hoặc chủ bản quyền sẽ phải chịu trách nhiệm đối với bất kỳ khiếu nại, thiệt hại hoặc trách nhiệm nào khác, cho dù trong hành động của hợp đồng, tra tấn hay nói cách khác, phát sinh từ hoặc liên quan đến phần mềm hoặc việc sử dụng hoặc các giao dịch khác trong PHẦN MỀM.
⬆ Quay lại đầu
Dịch
Hướng dẫn kiểu này cũng có sẵn trong các ngôn ngữ khác: