2010-07-28 20 views
15

Tôi đã kiểm tra JSLint và một số quy tắc đã đánh dấu sự quan tâm của tôi. Đặc biệt này:Tại sao ý tưởng tồi là cho phép những điều này trong JavaScript ==,! =, ++, -

Disallow == và =

Disallow ++ và -

Tại sao nó là một ý tưởng tồi để không cho phép những? Tôi hiểu phần đầu tiên, về cơ bản nó muốn tôi làm === thay vì ==. Mặc dù vậy, tôi không hiểu được lý do tại sao. Tôi hiểu sự khác biệt giữa hai, tôi chỉ muốn biết tại sao nó là thực hành xấu. Một số lần tôi thực sự muốn làm ví dụ == để nó đánh giá đúng cho undefined == null

Điều thứ hai, tôi cũng không hiểu chút nào. Liệu nó có muốn tôi làm myInt + = 1 thay vì myInt ++ không?

Cảm ơn!

+1

Sau khi đọc câu trả lời của mọi người, bây giờ tôi hiểu tại sao khẩu hiệu JSLint là "JSLint sẽ làm tổn thương cảm xúc của bạn." – 7wp

+0

Xem [Tại sao tránh các toán tử tăng ("++") và giảm ("-") trong JavaScript?] (Http://stackoverflow.com/questions/971312/why-avoid-increment-and-decrement-operators- trong javascript) –

+0

@Matthew, tại sao bạn bỏ phiếu để đóng câu hỏi của mình? Một trong những khác bạn liên kết không giải quyết câu hỏi của tôi về == và! = (Mặc dù nó không nói về ++ và -) – 7wp

Trả lời

4

Douglas Crockford (chàng người đã viết JSLint) giải thích mình trong video này:

http://www.youtube.com/watch?v=hQVTIJBZook#t=14m45s

nhưng về cơ bản (như mọi người khác đã đề cập) đó là vì các loại coercian.

Đáng xem video thực sự là ai - rất thú vị và hữu ích.

+0

Cảm ơn bạn đã liên kết, tôi sẽ xem nó. – 7wp

+0

Video đó hữu ích, nó giải thích rất nhiều. Bây giờ tôi cũng thích đọc sách của anh ấy. – 7wp

+0

Rất vui khi được nghe! :) Sách của ông cũng rất hay, có lẽ là văn bản JavaScript tốt nhất hiện có! Như bạn có thể tưởng tượng, nó mở rộng rất nhiều về nội dung trong video. Đừng bị lừa bởi chỉ 150 trang. Có lẽ cuốn sách kỹ thuật dày đặc nhất mà tôi đã đọc. Trang cho trang là một món hời. P.S. - Tôi không nhận được phần thưởng cho việc này;) – lucas1000001

10

Doug Crockford có những ý tưởng của riêng mình về những gì là "tốt" và "xấu" trong Javascript. Theo đó, JSLint thực hiện các kiểm tra này, nhưng làm cho chúng trở thành tùy chọn nếu bạn không hoàn toàn đồng ý với anh ta.

Không cho phép == giúp bạn không phạm sai lầm khi thực sự có nghĩa là ===. Tất nhiên điều này giả định rằng bạn không bao giờ thực sự muốn sử dụng ==.

Không cho phép các ++-- là một điều phong cách, một số người tin rằng họ là khó đọc hơn += 1-= 1.

+2

Phải .. Tôi đoán những gì tôi muốn biết là lý do tại sao ông sẽ xem xét những 'tốt', ngay cả khi tôi không đồng ý với nó. Chỉ muốn biết quan điểm của mình. – 7wp

+9

Tôi khuyên bạn nên đọc [Javascript: The Good Parts] (http://books.google.co.nz/books?id=PXa2bby0oQ0C) để biết chi tiết đầy đủ về quan điểm của Crockford. –

3

Từ instructions:

Các == và = nhà khai thác gõ ép buộc trước khi so sánh. Điều này là xấu bởi vì nó gây ra '\ t \ r \ n' == 0 là đúng. Điều này có thể che dấu các lỗi loại.

CáC++ (increment) và - (giảm) các nhà khai thác đã được biết đến để đóng góp vào mã xấu bằng cách khuyến khích trickiness quá mức. Chúng chỉ đứng sau kiến ​​trúc bị lỗi trong việc cho phép virus và các đe dọa an ninh khác. Có một tùy chọn cộng thêm cấm sử dụng các toán tử này.

12

Tôi không đồng ý quá nhiều với những quy tắc này, thay vì ngăn cản việc sử dụng ==, tôi muốn giới thiệu đến học về kiểu ép buộc.

Lý do chính về việc tại sao Crockford muốn tránh == là các quy tắc so sánh tùy thuộc vào loại của toán hạng có thể làm cho toán tử này phi bắc cầu, ví dụ, nếu:

A == B AND 
B == C 

doesn' t đảm bảo rằng:

A == C 

Một ví dụ thực tế:

'0' == 0; // true 
0 == ''; // true 
'0' == ''; // false 

Các nghiêm ngặt === điều hành là không thực sự cần thiết khi bạn so sánh giá trị của cùng loại, ví dụ:

if (typeof foo == "function") { } 

Chúng tôi so sánh kết quả của typeof điều hành, đó là luôn một chuỗi, với một chuỗi đen ...

Một ví dụ khác, khi bạn so sánh một cái gì đó chống lại null, == cũng so sánh với undefined, ví dụ:

if (something == null) {} 

VS

if (something === null || typeof something === "undefined") {} 

Hai điều kiện trên là vào cuối tương đương, nhưng một trong những đầu tiên nhiều dễ đọc hơn, tất nhiên nếu bạn biết về loại cưỡng chế và cách cư xử ==.

Tìm hiểu cách hoạt động của toán tử ==, sẽ giúp bạn quyết định sử dụng một cách khôn ngoan.

bài được khuyến nghị:

+0

Tôi nghĩ rằng '0' == 0 được đánh giá là đúng đối với tôi, và nó cho tôi sự linh hoạt cho phép tôi viết ít mã hơn. – 7wp

+0

tương tự: tôi biết tất cả về gõ tĩnh, nhưng tôi vẫn muốn trình biên dịch của tôi để thực thi nó cho tôi. –

+0

@ 7wp: Một vấn đề với so sánh kiểu hỗn hợp là 'someNumber == someString' không cho biết lập trình viên có quan tâm điều gì sẽ xảy ra nếu các phương pháp đánh giá khác nhau có thể mang lại kết quả khác nhau hay không. tất cả các phương pháp đánh giá sẽ mang lại kết quả tương tự. IMHO, một ngôn ngữ tốt nên chỉ cho phép so sánh như vậy trong trường hợp không có sự mơ hồ, và nơi transitivity được duy trì. – supercat

0

Tôi hiểu ==. (Điều undefined == null là một ngoại lệ)

("0" == false) === true 
("0" === false) === false 

Tôi chưa bao giờ hiểu được ++-- điều mặc dù. Tôi không thích làm i+=1 trên tất cả mã của mình (nó chậm hơn ++i).

+1

'--x +++ x-x ++'. Contrived, nhưng đối số duy nhất của tôi chống lại '++' và '--'. :) –

+0

haha. thats thậm chí không hợp lệ. :-) –

+0

Nhưng đây là: '--x + ++ x-x ++' (chỉ cần thêm một dấu cách), và nó gần như là xấu –

2

Các toán tử ==!= thực hiện cuộc trò chuyện ngầm của các toán tử nếu cần, trong khi các toán tử ===!== thì không. Ví dụ: biểu thức 4 == '4' sẽ đúng, trong khi biểu thức 4 === '4' sẽ là sai.

Ưu tiên bạn nên biết các loại dữ liệu bạn đang xử lý, để bạn có thể thực hiện so sánh đúng trong mã.

Các ++-- nhà khai thác không gây ra bất kỳ vấn đề nếu chúng được sử dụng một mình trong một tuyên bố, nhưng chúng thường được sử dụng để làm cho một tuyên bố rằng không nhiều hơn một điều theo một cách không rõ ràng, như:

arr[++idx] = 42; 

đó sẽ rõ ràng hơn như:

idx += 1; 
arr[idx] = 42; 
Các vấn đề liên quan