2012-03-17 39 views
5

Khi làm việc trong javascript ai đó có thể cung cấp cho tôi một tài liệu tham khảo hay giải thích tốt về kiểm tra bình đẳng/bất bình đẳng và ép buộc loại? Từ những gì tôi đã đọc Tôi thấy nơi có hai nguyên tắc suy nghĩ về việc sử dụng eqeq (==) so với eqeqeq (===) một số cảm thấy rằng bạn không nên sử dụng eqeq và luôn sử dụng eqeqeq vì nó là an toàn hơn để sử dụng.bình đẳng trong javascript

Tôi đã được chơi xung quanh với một số mẫu cơ bản và tôi đang gặp khó khăn sành điệu sự khác biệt hoặc khi tốt nhất để sử dụng một trong khác:

Ví dụ: đây là một số kịch bản cơ bản tôi đã viết ra. Khi tôi kiểm tra bằng eqeq hoặc eqeqeq, tôi nhận được kết quả tương tự. Tôi đã không nhìn thấy một ví dụ nào được nêu ra, nơi tôi sẽ nhận được một kết quả khác nhau (ví dụ: bằng cách sử dụng eqeq trả về đúng nơi eqeqeq trả về false).

function write(message){ 

    document.getElementById('message').innerHTML += message +'<br/>'; 
} 


var tim = { name: "tim" }; 
var tim2 = { name: "tim" }; 
//objects are equal to themselves (== vs ==== eqeq or eqeqeq) 
write("tim eq tim: " + (tim == tim)); //returns true 

//objects are only equal to themselves regardless of containing value got that 
write("tim eq tim2: " + (tim === tim2)); //returns false 

//access the primative type to test true or false 
write("tim value eq tim2 value: " + (tim.name === tim2.name)); //returns true 
//how does this differ in efficency over the eqeq operator? is one safer to use over the other? 
//write("tim value eq tim2 value: " + (tim.name == tim2.name)); //also returns true 

//testing primatives 

write("apple eqeqeq apple: " + ("apple" === "apple")); //true 
write("apple eqeqeq apple: " + ("apple" == "apple")); //true 

Ai đó có thể giải thích hoặc tham khảo tôi có thể đọc giúp làm rõ thêm một chút.

cổ vũ,

+5

http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use –

Trả lời

3

Sự khác biệt giữa == và === khá đơn giản: == là so sánh giá trị. === là so sánh giá trị và loại. Sử dụng === sẽ ngăn JavaScript tự động xác định loại và so sánh các giá trị chính xác như chúng.

5 == "5"  //true - JS compares the number 5 to a string of "5" and determines the contents are the same 
5 === "5" //false - A character is not a number, they can't be the same. 

0 == false //true - false is a bool, 0 is numerical, but JS determines that 0 evaluates to false 
0 === false //false - numeric is not boolean, they can't be exactly the same thing 

5 == 5.0  //true - need I say more? 
5 === 5.0 //true - one is a float and one is an int, but JS treats them all as numerical 

Tôi thấy điều quan trọng đối với các thử nghiệm có chức năng có thể trả về cả false (cho thất bại) và 0 (là kết quả hợp pháp).

JS có tổng cộng 5 loại nguyên thủy = số, chuỗi, boolean, null và không xác định. === yêu cầu cả hai đối số phải cùng loại giá trị bằng nhau để trả về giá trị thực. Không có phao, int, dài, ngắn, vv - bất kỳ loại số nào được gộp lại với nhau thành số.

0

=== là toán tử bình đẳng nghiêm ngặt chỉ trả về true nếu các biến có cùng loại và giá trị.

a = 1; 
b = "1"; 

a == b sẽ trở thành sự thật, a === b sẽ trả về false

0

Nguyên tắc của == không phải là dễ nhớ, bạn có thể nhận được tất cả các câu trả lời đúng các ví dụ dưới đây?

"" == "0" // false 
0 == "" // true 
0 == "0" // true 
false == "false" // false 
false == "0" // true 
false == undefined // false 
false == null // false 
null == undefined // true 
" \t\r\n" == 0 // true 

Vì vậy, nó là tốt hơn chỉ sử dụng ===, và không bao giờ sử dụng ==.

+0

danh sách là lớn hơn nhiều, Tôi dành hai giờ hôm nay và tìm thấy nhiều hơn nữa. '[] ==" "', '0 ==" "', '" 1 "== true' ... v.v. Ngoài ra bạn nên đặt nguồn http://bonsaiden.github.com/JavaScript-Garden/ # types.equality – ajax333221

+0

Tất cả đều có ý nghĩa nếu bạn biết C. Con trỏ là ints. Booleans là ints. Mảng là con trỏ. Chuỗi là mảng. NULL là (là) 0. false là 0. Chỉ cần nói. Nếu bạn tò mò, hãy thử tìm ra những gì với cái này: '[0] == false // => true' – superlukas

1

Thật đơn giản.
== thực hiện chuyển đổi loại và sau đó so sánh giá trị được chuyển đổi với giá trị mong muốn của bạn
=== không thực hiện chuyển đổi loại và so sánh trực tiếp giá trị của bạn.
Rõ ràng === là tốt hơn về hiệu suất và độ chính xác nhưng == cũng thuận lợi trong một số trường hợp để bạn có thể sử dụng cả hai nếu chúng phù hợp với nhu cầu của bạn.

comparisons

Chúc mừng!

0

Bạn phải đã nghe ai đó rằng javascript là ngôn ngữ được nhập rất lỏng lẻo.

Vì vậy, như đã nói ở trên siêu thực The (==) điều hành được sử dụng khi bạn chỉ muốn so sánh các giá trị của các đối số và không quan tâm về loại của họ như 5 == "5" sẽ trở thành sự thật. Đây là trường hợp khi bạn muốn xem (ví dụ như những gì người dùng quan trọng nhấn và bạn không quan tâm về loại của nó có thể là một chuỗi, một char hoặc một số nguyên).

Nhưng tôi cũng có trường hợp khi loại đối số cũng quan trọng. Trong những trường hợp như vậy, bạn muốn so sánh các loại toán tử. Vì vậy, trong những trường hợp đó bạn sử dụng toán tử bình đẳng ba. Ví dụ: nếu bạn đang thực hiện một số phép toán cộng hoặc phép nhân thì bạn muốn đảm bảo rằng các toán hạng thuộc loại tương thích. Vì vậy, bạn sử dụng toán tử triple (===).

1

Dưới đây là một danh sách rất đầy đủ về những điều mà bạn sẽ không mong đợi khi sử dụng khai thác bình đẳng

Tất cả những điều sau đây là đúng sự thật:

0    ==   "" 
0    ==   " " 
0    ==   [] 
false   ==   "" 
false   ==   " " 
false   ==   [] 
[]    ==   "" 
null   ==   undefined 
"str"   ==   ["str"] 

"1"    ==   true 
"0"    ==   false 

"null"   !=   null 
"false"   !=   false 
"true"   !=   true 
"undefined"  !=   undefined 
"NaN"   !=   NaN 

NaN    !=   NaN   //exception: NO exception 
{}    !=   {}   //exception: same reference 
[]    !=   []   //exception: same reference 

-------------------------------------- 

new Number(10)  !==   10 
new String("str") !==   "str" 
NaN     !==   NaN  //exception: NO exception 
{}     !==   {}  //exception: same reference 
[]     !==   []  //exception: same reference 

(Một số trong số họ đến từ this source)

Kết luận, không bao giờ sử dụng ==. Thậm chí khi bạn muốn:.

"Nó là rất khuyến khích để chỉ sử dụng các nhà điều hành bình đẳng nghiêm ngặt Trong trường hợp loại cần phải được ép buộc, nó nên được thực hiện một cách rõ ràng và không trái sang ép buộc phức tạp của ngôn ngữ quy tắc."

(source)

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