2011-09-01 34 views
13

Có rất nhiều hướng dẫn cho ===== do vậy không hướng dẫn cho tôi đến một hướng dẫn cơ bản, câu hỏi của tôi là cụ thể hơn một chút:Chuỗi bình đẳng hoạt động như thế nào trong JavaScript?

Ví dụ http://www.w3schools.com/jsref/jsref_obj_string.asp bang rằng:

Cú pháp:

var txt = new String("string"); 

// or more simply: 
var txt = "string"; 

Tốt, nhưng còn thế thì sao?

alert(new String("a") == new String("a")); // false 
alert("a" == "a"); // true 

var a = new String("a"); 
var b = new String("a"); 
alert(a == b); // false 

var c = "a"; 
var d = "a"; 
alert(c == d); // true 

alert(c === d); // true 
alert (a === c); // false 

Tất nhiên không ai gọi new String() dù sao, nhưng là nó điều gì đó về sự bình đẳng không vì new String() được xử lý như một đối tượng không phải là một chuỗi?

Và dĩ nhiên W3Schools không phải là nguồn đáng tin cậy nhất nhưng tôi đã dự kiến ​​tất cả các cảnh báo trên sẽ được nói đúng.

Vui lòng giải thích.

+3

Một tài liệu tham khảo tốt hơn nhiều là https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String –

+0

Hành vi này hiện đã được giải thích, nhưng một câu hỏi tiếp theo có thể là "Tại sao bạn bao giờ sử dụng 'new String()'? " – nnnnnn

+1

chỉ là một nhận xét nhỏ: http://w3fools.com/ – RoelF

Trả lời

12

"Kết quả đáng ngạc nhiên" xuất phát từ cách Javascript xử lý sự bình đẳng cho Đối tượng, cộng với sự nhầm lẫn phát sinh giữa chuỗi ký tự chuỗi và đối tượng Chuỗi. Từ Mozilla reference guide cho các nhà điều hành ==:

Nếu hai toán hạng không phải là cùng loại, JavaScript chuyển đổi toán hạng sau đó áp dụng so sánh nghiêm ngặt. Nếu toán hạng là một số hoặc boolean, toán hạng được chuyển đổi thành số nếu có thể; else nếu toán hạng là một chuỗi, toán hạng khác được chuyển thành chuỗi nếu có thể. Nếu cả hai toán hạng đều là đối tượng, thì JavaScript so sánh tham chiếu nội bộ bằng nhau khi toán hạng tham chiếu đến cùng một đối tượng trong bộ nhớ.

Bạn có thể trải nghiệm hành vi tương tự với những con số:

new Number(5) == new Number(5) // false 

Và rõ tâm trí của bạn bằng cách:

typeof "string" // string 
typeof new String("string") // object 
+0

Câu trả lời hay, rõ ràng và toàn diện! Cảm ơn! –

+0

Cảm ơn, đây là điều tôi muốn tìm. – SoonDead

4

Chuỗi ký tự, là các loại giá trị nguyên thủy, khác với các đối tượng mới String, là các thực thể có tham chiếu riêng biệt bao bọc các giá trị đó. Xem Predefined Core Objects trong tài liệu JavaScript của Mozilla để biết chi tiết.

Vì vậy, bạn đúng trong so sánh đó được xử lý khác nhau cho các chữ và đối tượng, đơn giản chỉ vì một so sánh giá trị của chúng trong khi so sánh các tham chiếu khác.

3

Bạn là chính xác rằng trong trường hợp ví dụ của bạn, bạn đang so sánh 2 đối tượng tham chiếu khác nhau . Trong đặc tả ngôn ngữ, bạn sẽ tìm thấy thuật toán này. Phần bạn đang tìm kiếm là phần 1 f.

11.9.3 Tóm tắt bình đẳng So sánh thuật toán

 
11.9.3 The Abstract Equality Comparison Algorithm 

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as 
follows: 

1. If Type(x) is the same as Type(y), then 
    a. If Type(x) is Undefined, return true. 
    b. If Type(x) is Null, return true. 
    c. If Type(x) is Number, then 
     i. If x is NaN, return false. 
     ii. If y is NaN, return false. 
     iii. If x is the same Number value as y, return true. 
     iv. If x is +0 and y is -0, return true. 
     v. If x is -0 and y is +0, return true. 
     vi. Return false. 
    d. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same 
     length and same characters in corresponding positions). Otherwise, return false. 
    e. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false. 
    f. Return true if x and y refer to the same object. Otherwise, return false. 
2. If x is null and y is undefined, return true. 
3. If x is undefined and y is null, return true. 
4. If Type(x) is Number and Type(y) is String, 
return the result of the comparison x == ToNumber(y). 
5. If Type(x) is String and Type(y) is Number, 
return the result of the comparison ToNumber(x) == y. 
6. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y. 
7. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 
8. If Type(x) is either String or Number and Type(y) is Object, 
return the result of the comparison x == ToPrimitive(y). 
9. If Type(x) is Object and Type(y) is either String or Number, 
return the result of the comparison ToPrimitive(x) == y. 
10. Return false. 

Cũng chú ý rằng bước 8 và 9 mà làm cho đối phó với String đối tượng một chút bụi.

alert(new String("a") == "a"); // true 
alert("a" == new String("a")); // true 
+0

Cảm ơn điều này cũng được, tôi đã chấp nhận một câu trả lời khác nhưng điều này chỉ là giáo dục. – SoonDead

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