Cách chính xác để kiểm tra sự bằng nhau giữa các Chuỗi trong JavaScript là gì?
{} == "[object Object]"
đánh giá là đúng, chẳng hạn.
String().equals()
không phải là một phương pháp trong JS ...
Cách chính xác để kiểm tra sự bằng nhau giữa các Chuỗi trong JavaScript là gì?
{} == "[object Object]"
đánh giá là đúng, chẳng hạn.
String().equals()
không phải là một phương pháp trong JS ...
Câu trả lời:
luôn luôn Cho đến khi bạn hiểu đầy đủ về sự khác biệt và ý nghĩa của việc sử dụng cáctoán tử==
và===
toán tử, hãy sử dụng===
toán tử vì nó sẽ cứu bạn khỏi các lỗi và các WTF tối nghĩa (không rõ ràng). ==
Toán tử"thông thường"có thể có kết quả rất bất ngờ do loại cưỡng chế trong nội bộ, vì vậy sử dụng===
luôn là phương pháp được khuyến nghị.
Để hiểu rõ hơn về điều này và các phần "tốt so với xấu" khác của Javascript, hãy đọc về ông Douglas Crockford và công việc của ông. Có một Google Tech Talk tuyệt vời nơi anh ấy tóm tắt rất nhiều thông tin hay: http://www.youtube.com/watch?v=hQVTIJBZook
Cập nhật:
Các bạn không biết JS loạt bởi Kyle Simpson là tuyệt vời (và miễn phí để đọc trên mạng). Loạt bài đi vào các lĩnh vực thường bị hiểu sai về ngôn ngữ và giải thích "những phần xấu" mà Crockford gợi ý bạn nên tránh. Bằng cách hiểu chúng, bạn có thể sử dụng chúng đúng cách và tránh những cạm bẫy.
Cuốn sách " Lên & Đi " bao gồm một phần về Bình đẳng , với bản tóm tắt cụ thể này về thời điểm sử dụng toán tử lỏng ( ==
) so với nghiêm ngặt ( ===
):
Để tổng hợp rất nhiều chi tiết cho một vài thao tác đơn giản và giúp bạn biết nên sử dụng
==
hay===
trong các tình huống khác nhau, đây là các quy tắc đơn giản của tôi:
- Nếu một trong hai giá trị (còn gọi là bên) trong một so sánh có thể là giá trị
true
hoặcfalse
giá trị, hãy tránh==
và sử dụng===
.- Nếu một trong hai giá trị trong một so sánh có thể là các giá trị cụ thể (
0
,""
hoặc[]
- mảng trống), tránh==
và sử dụng===
.- Trong tất cả các trường hợp khác, bạn an toàn để sử dụng
==
. Không chỉ an toàn, mà trong nhiều trường hợp, nó đơn giản hóa mã của bạn theo cách cải thiện khả năng đọc.
Tôi vẫn khuyên bạn nên nói chuyện với Crockford cho các nhà phát triển, những người không muốn đầu tư thời gian để thực sự hiểu Javascript, đó là lời khuyên tốt cho nhà phát triển chỉ thỉnh thoảng làm việc trong Javascript.
if (typeof foo == "string")
===
toán tử và không bao giờ phải lo lắng về "tôi thực sự, hoàn toàn, chắc chắn 100% ==
sẽ hành xử theo cách tôi nghĩ?"
++
/ --
).
++
hoặc --
hoặc các if/else
câu lệnh đơn continue
hoặc new
nhà điều hành hoặc bất kỳ số thực hành mã hoàn toàn hợp pháp nào khác mà Crockford đã coi là "có hại". Và tất nhiên không bao giờ thậm chí xem xét suy nghĩ về việc sử dụng eval
hoặc with
ngay cả khi những cạm bẫy của họ được hiểu rõ. Và bạn đã thấy phiên bản tiếp theo của JS chưa? Cú pháp chặt chẽ hơn và một số ít các hàm trợ giúp, một số đã trôi nổi trong nhiều năm, là tất cả những gì chúng ta nhận được sau tất cả thời gian này. Cú pháp đã không phát triển chút nào. Nếu Crockford đứng sau điều này, thì đó là một điều tồi tệ.
Nếu bạn biết chúng là các chuỗi, thì không cần phải kiểm tra loại.
"a" == "b"
Tuy nhiên, lưu ý rằng các đối tượng chuỗi sẽ không bằng nhau.
new String("a") == new String("a")
sẽ trả lại sai.
Gọi phương thức valueOf () để chuyển đổi nó thành nguyên hàm cho các đối tượng String,
new String("a").valueOf() == new String("a").valueOf()
sẽ trở lại đúng
new String("a") == "a"
là đúng (nhưng sẽ không đúng ===
), vì phía bên trái sẽ được chuyển đổi thành giá trị chuỗi nguyên thủy.
new String("a") == new String("a")
, new String("a") === new String("b")
, new String("a") === new String("a")
tất cả sẽ trở lại false
, kể từ khi bạn đang làm việc với tài liệu tham khảo để các đối tượng của String
lớp, không phải nguyên thủy loại string
.
new String(foo)
tạo một đối tượng chuỗi và String(foo)
chuyển đổi foo thành một chuỗi nguyên thủy.
Chỉ cần một bổ sung cho câu trả lời: Nếu tất cả các phương thức này trả về false, ngay cả khi các chuỗi dường như bằng nhau, có thể có một khoảng trắng ở bên trái và hoặc bên phải của một chuỗi. Vì vậy, chỉ cần đặt một .trim()
ở cuối chuỗi trước khi so sánh:
if(s1.trim() === s2.trim())
{
// your code
}
Tôi đã mất hàng giờ để cố gắng tìm ra những gì sai. Hy vọng điều này sẽ giúp cho một ai đó!
fetch
). Cảm ơn rất nhiều.
điều gì dẫn tôi đến câu hỏi này là padding
vàwhite-spaces
kiểm tra trường hợp của tôi
if (title === "LastName")
doSomething();
và tiêu đề là " LastName"
vì vậy có lẽ bạn phải sử dụng
trim
chức năng như thế này
var title = $(this).text().trim();
.toString().trim()
trong
Trừ khi bạn thực sự biết cách thức hoạt động cưỡng chế, bạn nên tránh ==
và sử dụng toán tử nhận dạng ===
thay thế. Nhưng bạn nên đọc nó để hiểu làm thế nào nó hoạt động .
Nếu bạn sử dụng ==
, bạn để ngôn ngữ thực hiện một số kiểu ép buộc cho bạn, ví dụ:
"1" == 1 // true
"0" == false // true
[] == false // true
Như Douglas Crockford's đã nói trong cuốn sách của mình:
Luôn luôn sử dụng toán tử nhận dạng tốt hơn.
{}==" "
đã cho tôi Unexpected token ==
cách chính xác để làm điều đó?
Thực tế, có hai cách để tạo chuỗi trong javascript.
var str = 'Javascript';
Điều này tạo ra một giá trị chuỗi nguyên thủy.
var obj = new String('Javascript');
Điều này tạo ra một đối tượng bao bọc của loại String
.
typeof str // string
typeof obj // object
Vì vậy, cách tốt nhất để kiểm tra sự bằng nhau là sử dụng ===
toán tử vì nó kiểm tra giá trị cũng như loại của cả hai toán hạng.
Nếu bạn muốn kiểm tra sự bằng nhau giữa hai đối tượng thì sử dụng String.prototype.valueOf
là cách chính xác.
new String('javascript').valueOf() == new String('javascript').valueOf()
Chuỗi Objects
có thể được kiểm tra bằng JSON.stringyfy()
thủ thuật.
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
Cách dễ nhất để làm điều đó là sử dụng một toán tử ternary như vậy:
"was" == "was" ? true : false
nhưng nếu chuỗi bạn muốn so sánh nằm trong một mảng, bạn sẽ sử dụng bộ lọc es6
let stringArray = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ?
stringArray.pop(indexOf(I)) : null)
ở trên sẽ kiểm tra chuỗiArray của bạn và bất kỳ chuỗi nào khớp với nó từ mảng mà trong trường hợp của chúng tôi, chúng tôi đã chọn "boys"
Tôi đã đưa ra một giải pháp thay thế trong quá trình thử nghiệm. bạn có thể sử dụng chức năng trên nguyên mẫu chuỗi.
String.prototype.betwenStr = function(one){
return JSON.stringify(new String(this)) === JSON.stringify(new String(one));
}
//call it
"hello world".betweenStr("hello world"); //returns boolean
//value
hoạt động tốt trong trình duyệt chrome
==
.