Eval là javascript xấu?
Giá trị lâu dài của phần mềm đối với một tổ chức tỷ lệ thuận với chất lượng của cơ sở mã. Trong suốt vòng đời của nó, một chương trình sẽ được xử lý bởi nhiều cặp tay và mắt. Nếu một chương trình có thể truyền đạt rõ ràng cấu trúc và đặc điểm của nó, thì ít có khả năng nó sẽ bị hỏng khi sửa đổi trong tương lai không xa. Quy ước mã có thể giúp giảm độ giòn của chương trình Show
Tất cả mã JavaScript của chúng tôi được gửi trực tiếp tới công chúng. Nó phải luôn luôn có chất lượng xuất bản. số lượng gọn gàng. Sự đa dạng về con người, văn hóa và quan điểm là một điều tốt và có giá trị. Đa dạng về phong cách lập trình là một điều xấu. Nó tạo ra xung đột, cản trở khả năng làm việc cùng nhau của mọi người. Nó có thể giúp các lỗi hình thành và ẩn náu dễ dàng hơn Tệp JavaScriptCác chương trình JavaScript phải được lưu trữ và phân phối dưới dạng tệp let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };9 Không nên nhúng mã JavaScript vào tệp HTML trừ khi mã này dành riêng cho một phiên duy nhất. Mã trong HTML bổ sung đáng kể vào trọng lượng trang mà không có cơ hội giảm thiểu bằng cách lưu vào bộ đệm, thu nhỏ và nén Khoảng trắngNếu có thể, những quy tắc này phù hợp với hàng thế kỷ thực hành tốt với phong cách văn học. Những sai lệch so với văn phong chỉ nên được chấp nhận nếu có bằng chứng chắc chắn về lợi ích đáng kể. Sở thích cá nhân không phải là một lợi ích đáng kể Các dòng trống cải thiện khả năng đọc bằng cách tắt các phần mã có liên quan về mặt logic Các khoảng trống phải luôn được sử dụng trong các trường hợp sau
while (true) {
Mọi câu lệnh phải bắt đầu được căn chỉnh với vết lõm hiện tại. Mức ngoài cùng nằm ở lề trái. Khoảng cách thụt vào tăng thêm 4 khoảng trắng khi mã thông báo cuối cùng trên dòng trước đó là // Set i to zero. i = 0;20 dấu ngoặc trái, // Set i to zero. i = 0;8 dấu ngoặc trái, // Set i to zero. i = 0;0 dấu ngoặc trái. Mã thông báo đóng phù hợp sẽ là mã thông báo đầu tiên trên một dòng, khôi phục lại phần thụt đầu dòng trước đó Toán tử bậc ba có thể gây nhầm lẫn về mặt trực quan, vì vậy hãy bọc toàn bộ biểu thức bậc ba trong dấu ngoặc đơn. Điều kiện, dấu chấm hỏi // Set i to zero. i = 0;23 và dấu hai chấm // Set i to zero. i = 0;24 luôn bắt đầu một dòng, thụt vào 4 dấu cách let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); }; Các mệnh đề ( // Set i to zero. i = 0;25, // Set i to zero. i = 0;26, // Set i to zero. i = 0;27, // Set i to zero. i = 0;28, // Set i to zero. i = 0;29) không phải là mệnh đề nên không được thụt vào như mệnh đề Việc sử dụng các tab gây ra sự nhầm lẫn, tranh luận và khóc lóc, với rất ít giá trị bù đắp. Không sử dụng tab. Sử dụng không gian Hãy hào phóng với ý kiến. Sẽ rất hữu ích nếu bạn để lại thông tin mà mọi người (có thể là chính bạn trong tương lai) sẽ đọc sau này, những người sẽ cần hiểu bạn đã làm gì và tại sao. Các ý kiến có giá trị nhất nói về ý định và lý do, những điều không dễ dàng phát hiện ra bằng cách đọc mã. Các bình luận phải được viết tốt và rõ ràng, giống như mã mà chúng đang chú thích. Một chút hài hước thỉnh thoảng có thể được đánh giá cao. Thất vọng và oán giận sẽ không Điều quan trọng là các ý kiến được cập nhật. Nhận xét sai có thể khiến chương trình khó đọc và khó hiểu hơn Làm cho nhận xét có ý nghĩa. Tập trung vào những gì không thể nhìn thấy ngay lập tức. Đừng lãng phí thời gian của người đọc với những thứ như // Set i to zero. i = 0; Sử dụng chú thích theo dòng, không chặn chú thích. Các bình luận nên bắt đầu ở lề trái Tuyên bố biếnTất cả các biến nên được khai báo trước khi sử dụng. JavaScript không yêu cầu điều này, nhưng làm như vậy giúp chương trình dễ đọc hơn và giúp dễ dàng phát hiện các biến không được khai báo có thể trở thành hàm ý. Các biến toàn cục ngụ ý không bao giờ được sử dụng. Việc sử dụng các biến toàn cầu nên được giảm thiểu // Set i to zero. i = 0;2 Khai báo hàmTất cả các chức năng nên được khai báo trước khi chúng được sử dụng. Các hàm bên trong phải xuất hiện sau các khai báo biến của hàm bên ngoài. Điều này giúp làm rõ những biến nào được bao gồm trong phạm vi của nó Không được có khoảng cách giữa tên của hàm và dấu ngoặc đơn bên trái // Set i to zero. i = 0;0 của danh sách tham số của hàm đó. Phải có một khoảng trắng giữa dấu ngoặc đơn bên phải // Set i to zero. i = 0;61 và dấu ngoặc nhọn bên trái // Set i to zero. i = 0;20 bắt đầu nội dung câu lệnh. Phần thân được thụt vào bốn khoảng trống. Dấu ngoặc nhọn bên phải // Set i to zero. i = 0;63 được căn chỉnh với dòng chứa phần đầu của phần khai báo hàm // Set i to zero. i = 0;6 Quy ước này hoạt động tốt với JavaScript vì trong JavaScript, các hàm và ký tự đối tượng có thể được đặt ở bất kỳ đâu mà một biểu thức được cho phép. Nó cung cấp khả năng đọc tốt nhất với các chức năng nội tuyến và cấu trúc phức tạp // Set i to zero. i = 0;0 Nếu một hàm theo nghĩa đen là ẩn danh, thì phải có một khoảng trắng giữa từ // Set i to zero. i = 0;4 và dấu ngoặc đơn bên trái // Set i to zero. i = 0;0. Nếu khoảng trắng bị bỏ qua, thì có vẻ như tên của hàm là // Set i to zero. i = 0;4, cách đọc không chính xác // Set i to zero. i = 0;4 Việc sử dụng các chức năng toàn cầu nên được giảm thiểu Khi một hàm được gọi ngay lập tức, toàn bộ biểu thức gọi phải được bao bọc trong dấu ngoặc đơn để rõ ràng rằng giá trị được tạo ra là kết quả của hàm chứ không phải chính hàm đó // Set i to zero. i = 0;5 tênTên nên được hình thành từ 26 chữ hoa và chữ thường ( // Set i to zero. i = 0;67. // Set i to zero. i = 0;68, // Set i to zero. i = 0;69. // Set i to zero. i = 0;00), 10 chữ số (______301. // Set i to zero. i = 0;02) và // Set i to zero. i = 0;03 thanh dưới. Tránh sử dụng các ký tự quốc tế vì chúng có thể đọc không rõ hoặc không được hiểu ở mọi nơi. Không sử dụng ký hiệu đô la ________ 304 hoặc dấu gạch chéo ngược 305 trong tên Không sử dụng thanh gạch dưới // Set i to zero. i = 0;03 làm ký tự đầu tiên hoặc cuối cùng của tên. Nó đôi khi nhằm biểu thị sự riêng tư, nhưng nó không thực sự cung cấp sự riêng tư. Nếu quyền riêng tư là quan trọng, hãy sử dụng đóng cửa. Tránh các quy ước thể hiện sự thiếu năng lực Hầu hết các biến và hàm nên bắt đầu bằng một chữ thường Hàm xây dựng phải được sử dụng với tiền tố // Set i to zero. i = 0;07 nên bắt đầu bằng chữ in hoa. JavaScript không đưa ra cảnh báo thời gian biên dịch cũng như cảnh báo thời gian chạy nếu một // Set i to zero. i = 0;07 bắt buộc bị bỏ qua. Điều tồi tệ có thể xảy ra nếu thiếu // Set i to zero. i = 0;07, vì vậy quy ước viết hoa là một biện pháp bảo vệ quan trọng Nên tránh các biến toàn cục, nhưng khi sử dụng nên ở trong // Set i to zero. i = 0;40 Các câu lệnhBáo cáo đơn giảnMỗi dòng nên chứa nhiều nhất một câu lệnh. Đặt dấu chấm phẩy // Set i to zero. i = 0;41 ở cuối mỗi câu lệnh không kết thúc bằng ____120khối // Set i to zero. i = 0;63. Lưu ý rằng một câu lệnh gán đang gán một hàm theo nghĩa đen hoặc theo nghĩa đen đối tượng vẫn là một câu lệnh gán và phải kết thúc bằng dấu chấm phẩy JavaScript cho phép bất kỳ biểu thức nào được sử dụng làm câu lệnh. Điều này có thể che giấu một số lỗi, đặc biệt là khi có chèn dấu chấm phẩy. Các biểu thức duy nhất nên được sử dụng làm câu lệnh là phép gán, lời gọi và // Set i to zero. i = 0;44 Báo cáo hợp chấtCâu lệnh ghép là câu lệnh chứa danh sách các câu lệnh được đặt trong dấu ngoặc nhọn // Set i to zero. i = 0;45
nhãnNhãn tuyên bố nên tránh. Chỉ những tuyên bố này nên được dán nhãn. // Set i to zero. i = 0;2, // Set i to zero. i = 0;52, // Set i to zero. i = 0;9, // Set i to zero. i = 0;54 Tuyên bố // Set i to zero. i = 0; 55Biểu thức giá trị trả về phải bắt đầu trên cùng một dòng với từ khóa // Set i to zero. i = 0;55 để tránh chèn dấu chấm phẩy // Set i to zero. i = 0; 1 Tuyên bốMột tuyên bố // Set i to zero. i = 0;1 nên có một trong những hình thức này // Set i to zero. i = 0;8 // Set i to zero. i = 0; 9 Tuyên bốNên tránh sử dụng // Set i to zero. i = 0;9, ưu tiên các phương thức mảng nếu có thể. Khi câu lệnh // Set i to zero. i = 0;9 được sử dụng, nó phải là một trong những dạng sau // Set i to zero. i = 0;2 câu lệnh whileMột tuyên bố // Set i to zero. i = 0;2 nên có mẫu sau let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };0 Tuyên bố // Set i to zero. i = 0; 52Một tuyên bố // Set i to zero. i = 0;52 nên có hình thức này let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };1 Không giống như các câu lệnh ghép khác, câu lệnh // Set i to zero. i = 0;52 luôn kết thúc bằng dấu chấm phẩy // Set i to zero. i = 0;41 Tuyên bố // Set i to zero. i = 0; 54Một câu lệnh // Set i to zero. i = 0;54 nên tránh, nhưng khi sử dụng nên có dạng này let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };2 Mỗi // Set i to zero. i = 0;25 được liên kết với // Set i to zero. i = 0;54. Điều này tránh thụt lề quá mức. Nhãn // Set i to zero. i = 0;25 không phải là một tuyên bố và không nên được thụt vào như một Mỗi nhóm câu (ngoại trừ // Set i to zero. i = 0;27) phải kết thúc bằng // Set i to zero. i = 0;23, // Set i to zero. i = 0;55 hoặc // Set i to zero. i = 0;25. Đừng rơi qua Tuyên bố // Set i to zero. i = 0; 26Tuyên bố // Set i to zero. i = 0;26 nên có mẫu này let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };3 Nên tránh mệnh đề // Set i to zero. i = 0;29. Nếu nó được sử dụng, nó sẽ có hình thức này let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };4 Tuyên bố // Set i to zero. i = 0; 29Tránh sử dụng câu lệnh // Set i to zero. i = 0;29. Nó có xu hướng che khuất luồng điều khiển của chức năng Tuyên bố let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };01Câu lệnh let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };01 không nên được sử dụng let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };03 và let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };04Sử dụng let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };03 thay vì let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };06. Sử dụng let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };04 thay vì let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };08 Sử dụng mảng khi tên thành viên sẽ là số nguyên liên tiếp. Sử dụng các đối tượng khi tên thành viên là chuỗi hoặc tên tùy ý let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };09 toán tử dấu phẩyTránh sử dụng toán tử dấu phẩy. (Điều này không áp dụng cho dấu phân cách dấu phẩy, được sử dụng trong ký tự đối tượng, ký tự mảng và danh sách tham số. ) Có một ký tự đôi khi là dấu phân cách và đôi khi là toán tử gây nhầm lẫn biểu thức chuyển nhượngTránh làm bài tập ở phần điều kiện của câu lệnh // Set i to zero. i = 0;1 và // Set i to zero. i = 0;2 Là let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };5 một phát biểu đúng? let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };6 dự định? Toán tử let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };12 và let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };13Sử dụng các toán tử let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };12 và let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };13. Các toán tử let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };16 và let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };17 tạo ra kết quả dương tính giả và âm tính giả, vì vậy chúng không nên được sử dụng Điểm cộng và điểm trừ khó hiểuHãy cẩn thận để không theo dõi một let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };18 với let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };18 hoặc let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };20. Mô hình này có thể gây nhầm lẫn. Chèn dấu ngoặc giữa chúng để làm rõ ý định của bạn let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };7 được viết tốt hơn như let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };8 để let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };21 không bị đọc nhầm thành let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };20. Tránh let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };20 let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };24 là Ác maHàm let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };24 là tính năng bị lạm dụng nhiều nhất của JavaScript. tránh nó let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };24 có bí danh. Không sử dụng hàm tạo let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };27. Không chuyển chuỗi tới let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };28 hoặc let integer = function ( value, default_value ) { value = resolve(value); return ( typeof value === "number" ? Math.floor(value) : ( typeof value === "string" ? value.charCodeAt(0) : default_value ) ); };29 |