2014-05-07 16 views
6

Nhìn giữa dòng đầu tiên của mã trong tập tin JS được rút gọn và unminified Bootstrap, có một sự chênh lệch ngay lập tức:Tại sao bộ chỉnh sửa Javascript chuyển đổi === thành ==?

// bootstrap.js 
if (typeof jQuery === 'undefined') { ... } 

vs

// bootstrap.min.js 
if("undefined"==typeof jQuery)... 

(Xem cho chính mình: bootstrap.jsbootstrap.min.js)

Tôi nhầm lẫn lý do tại sao điều này được cho phép. Sự hiểu biết của tôi (có lẽ là ngây thơ) là === luôn đạt được hiệu suất và thường xuyên ngăn các kết quả không mong muốn (ví dụ so sánh sai với 0 hoặc ""). Nó sẽ có vẻ rằng những lợi ích nhỏ trong các tập tin bị mất trong hiệu suất và tiềm năng cho kết quả sai lầm. Có ai có thể làm sáng ở đây không?

+0

'typeof' luôn trả về một chuỗi, vì vậy' === 'là không cần thiết. Bộ khai thác hoặc một số bộ xử lý khác mà tệp đã được chạy qua có thể đã nhận ra điều này. Không có tiềm năng cho một kết quả không chính xác, và ngay cả khi dòng này đã chạy thường xuyên, đủ để trở thành một nút cổ chai, bất kỳ sự khác biệt hiệu suất sẽ được JITted đi. – user2357112

+0

Mọi người đều trả lời mà không hiểu đầy đủ câu hỏi. – ndugger

+5

@NickDugger không đúng; câu hỏi khá rõ ràng. Lợi thế hiệu suất của '===' chỉ có liên quan khi các toán hạng không cùng loại. – Pointy

Trả lời

5

Trong mã cụ thể bạn đang trích dẫn, nó an toàn vì các loại toán hạng cả hai đều là bất biến và cả hai đều là chuỗi. Không có khả năng tiết kiệm hiệu suất có thể bởi vì sẽ không bao giờ cần phải có bất kỳ sự ép buộc nào. Hãy suy nghĩ về == như là một cái gì đó như thế này:

function ==(a, b) { // obviously this is fake 
    if (a === b) return true; 
    // type coercion ... 
} 

Ngoài ra, cá nhân tôi nghĩ rằng người ta nên sử dụng === qua ==ngữ nghĩa khác biệt và không phải vì hiệu suất. Tối ưu hóa vi mô như vậy không quan trọng đối với phần lớn mã mà hầu hết mọi người viết. (Đó là một chút mỉa mai trên thực tế rằng việc kiểm tra sự hiện diện của jQuery đang được thực hiện với một so sánh typeof, đó chính nó là một vi-tối ưu hóa có nghi vấn có giá trị.) oops đó là sai :)

+0

Câu trả lời hay! Chỉ muốn làm rõ cho bất kỳ ai khác có thể gặp khó khăn khi đọc mã giả mà '// gõ ép buộc' là _de facto_' else', không phải là mô tả về những gì đang xảy ra ở trên. – Impirator

+0

@Impirator oh có, điểm tốt. Tôi đã viết nó như thế để nhấn mạnh rằng công việc được hoàn thành nếu các giá trị bằng nhau theo các quy tắc so sánh '==='. – Pointy

0

typeof sẽ luôn trả về một chuỗi, vì vậy không cần phải lo lắng về việc chuyển đổi kiểu. Cuối cùng, điều này không thực sự tiết kiệm nhiều trong tập tin hoặc thực thi của nó, nhưng điều này được coi là một giả định an toàn.

Các vấn đề liên quan