Kỹ thuật sau đây (hoặc tương tự) thường được sử dụng để đảo ngược một chuỗi trong JavaScript:
// Don’t use this!
var naiveReverse = function(string) {
return string.split('').reverse().join('');
}
Trong thực tế, tất cả các câu trả lời được đăng cho đến nay là một biến thể của mẫu này. Tuy nhiên, có một số vấn đề với giải pháp này. Ví dụ:
naiveReverse('foo bar');
// → 'rab �� oof'
// Where did the `` symbol go? Whoops!
Nếu bạn đang tự hỏi tại sao điều này xảy ra, read up on JavaScript’s internal character encoding. (TL; DR:.
là một biểu tượng xuất hồn, và JavaScript cho thấy nó như là hai đơn vị mã riêng biệt)
Nhưng có nhiều:
// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana mañana');
// → 'anãnam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.
Một chuỗi tốt để kiểm tra chuỗi đảo ngược hiện thực là the following:
'foo bar mañana mañana'
Tại sao? Bởi vì nó có chứa một biểu tượng astral (
) (là represented by surrogate pairs in JavaScript) và một dấu kết hợp (ñ
trong mañana
cuối cùng thực sự bao gồm hai biểu tượng: U + 006E LATIN NHỎ LETTER N và U + 0303 COMBINING TILDE).
Thứ tự mà các cặp thay thế xuất hiện không thể đảo ngược, biểu tượng astral khác sẽ không hiển thị nữa trong chuỗi 'được đảo ngược'. Đó là lý do tại sao bạn thấy những nhãn hiệu ��
này ở đầu ra cho ví dụ trước.
Kết hợp nhãn hiệu luôn được áp dụng cho biểu tượng trước, vì vậy bạn phải xem cả biểu tượng chính (U + 006E LATIN SMALL LETTER N) làm dấu kết hợp (U + 0303 COMBINING TILDE). Đảo ngược thứ tự của chúng sẽ khiến cho dấu kết hợp được ghép nối với một biểu tượng khác trong chuỗi. Đó là lý do tại sao đầu ra mẫu có ã
thay vì ñ
.
Hy vọng điều này giải thích tại sao tất cả các câu trả lời được đăng cho đến nay là sai.
Để trả lời câu hỏi ban đầu của bạn - làm thế nào để [đúng] đảo ngược một chuỗi trong Javascript -, tôi đã viết một thư viện JavaScript nhỏ mà có khả năng đảo ngược chuỗi Unicode-aware. Nó không có bất kỳ vấn đề nào tôi vừa đề cập. Thư viện được gọi là Esrever; mã của nó là trên GitHub, và nó hoạt động trong khá nhiều môi trường JavaScript. Nó đi kèm với một tiện ích shell/nhị phân, vì vậy bạn có thể dễ dàng đảo ngược chuỗi từ thiết bị đầu cuối của bạn nếu bạn muốn.
var input = 'foo bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab oof'
_ "tất cả các phương thức mảng khác" _ - hiện '.sort()' có hoạt động không? Đối với những người làm việc, họ có làm việc trong tất cả các trình duyệt không? (Tôi đoán chúng sẽ thất bại đối với các trình duyệt cũ hơn không thực hiện ký hiệu chỉ mục kiểu «[]' kiểu mảng cho chuỗi, mặc dù tôi chưa thử nghiệm nó.) – nnnnnn
@nnnnnn sắp xếp không hoạt động cho cùng một lý do như vậy – Hai
@Hai: FYI, '.splice()' không thực sự hoạt động. Chrome là loại, đủ để cung cấp cho bạn giá trị trả về, nhưng nếu bạn tham khảo chuỗi gốc trước khi nối nó, bạn sẽ thấy rằng nó không được sửa đổi. –