2009-10-21 28 views
10

Tôi đang cố gắng viết mẫu thử để xác định xem chuỗi có trống không. Nó thực sự chỉ chơi với JS và nguyên mẫu, không có gì quan trọng. Đây là mã của tôi:Nhà điều hành nhận dạng JavaScript trên các chuỗi

String.prototype.IsEmpty = function() { 
    return (this === ""); 
} 

Thông báo Tôi đã sử dụng số === so sánh danh tính thay vì == bình đẳng. Khi tôi chạy chức năng với định nghĩa trên:

"".IsEmpty(); // false 

Nếu tôi chagne định nghĩa để sử dụng == như:

String.prototype.IsEmpty = function() { 
    return (this == ""); 
} 

Các def'n mới sẽ làm:

"".IsEmpty(); // true 

tôi không hiểu tại sao === không hoạt động kể từ "" giống hệt với ""

Trả lời

10

Đó là vì "" là một chuỗi nguyên thủy, nhưng khi bạn gọi .IsEmpty() nó mặc nhiên chuyển sang một đối tượng String.

Bạn sẽ cần phải gọi ToString() trên đó:

String.prototype.IsEmpty = function() { 
    return (this.toString() === ""); 
} 

Điều thú vị là đây là trình duyệt cụ thể - typeof thisstring trong Chrome.

Khi @pst chỉ ra, nếu bạn chuyển đổi theo cách khác và so sánh this === new String(""); nó vẫn không hoạt động vì chúng là các trường hợp khác nhau.

+0

Tôi chỉ đang nghĩ về điều đó - Chuỗi so với chuỗi. Cảm ơn bạn đã sửa chữa. –

9

=== là danh tính (cùng một đối tượng; x là x **). == là bình đẳng (cùng giá trị; x trông giống y).

Cho phép chơi một số (Rhino/JS 1.8):

{} === {} // false 
new String("") === new String("") // false 
typeof new String("") // object 

"" === "" // true 
typeof "" // string 
f = function() { return "f" }; 
"foo" === f() + "oo" // true 

String.prototype.foo = function() { return this; }; 
typeof "hello".foo() // object -- uh, oh! it was lifted 

Vì vậy, những gì vừa xảy ra?

Sự khác biệt giữa đối tượng Chuỗi và chuỗi. Tất nhiên, so sánh bình đẳng (hoặc .length) nên được sử dụng.

Các proof in the pudding, phần 11.9.6 thảo luận về các thuật toán điều hành ===

+1

Cũng sẽ thêm rằng 0, sai, "", null và đôi khi không xác định phù hợp với các hoạt động bình đẳng, có thể gây ra một số đầu gãi. – Tracker1