EDIT : Câu trả lời này ban đầu được thêm vào 9 năm trước. Hôm nay bạn nên sử dụng localeCompare
với sensitivity: 'accent'
tùy chọn:
function ciEquals(a, b) {
return typeof a === 'string' && typeof b === 'string'
? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
: a === b;
}
console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));
Các { sensitivity: 'accent' }
kể localeCompare()
để điều trị hai biến thể của bức thư cơ sở tương tự như giống nhau trừ khi họ có điểm nhấn khác nhau (như trong ví dụ thứ ba) ở trên.
Ngoài ra, bạn có thể sử dụng { sensitivity: 'base' }
, xử lý hai ký tự tương đương miễn là ký tự cơ sở của chúng giống nhau (do đó A
sẽ được coi là tương đương với á
).
Lưu ý rằng tham số thứ ba localeCompare
không được hỗ trợ trong IE10 hoặc thấp hơn hoặc một số trình duyệt di động nhất định (xem biểu đồ tương thích trên trang được liên kết ở trên), vì vậy nếu bạn cần hỗ trợ các trình duyệt đó, bạn sẽ cần một số dự phòng:
function ciEqualsInner(a, b) {
return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}
function ciEquals(a, b) {
if (typeof a !== 'string' || typeof b !== 'string') {
return a === b;
}
// v--- feature detection
return ciEqualsInner('A', 'a')
? ciEqualsInner(a, b)
: /* fallback approach here */;
}
Câu trả lời gốc
Cách tốt nhất để thực hiện so sánh không phân biệt chữ hoa chữ thường trong JavaScript là sử dụng match()
phương thức RegExp với i
cờ.
Tìm kiếm không phân biệt chữ hoa chữ thường
Khi cả hai chuỗi được so sánh là các biến (không phải là hằng), thì nó phức tạp hơn một chút vì bạn cần tạo RegExp từ chuỗi nhưng việc chuyển chuỗi sang hàm tạo RegExp có thể dẫn đến kết quả khớp không chính xác hoặc khớp không thành công nếu chuỗi có regex đặc biệt nhân vật trong đó.
Nếu bạn quan tâm đến việc quốc tế hóa, đừng sử dụng toLowerCase()
hoặc toUpperCase()
vì nó không cung cấp các so sánh không phân biệt chữ hoa chữ thường trong tất cả các ngôn ngữ.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
phương pháp javascript mới được thêm vào . Chỉ được hỗ trợ bởi các trình duyệt hiện đại tại thời điểm viết (IE11 +). xem developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/