Một công cụ sửa text cần thay mọi dấu chấm bằng dấu gạch. replace với pattern dạng string chỉ thay lần đầu. Đổi sang RegExp có thể lại khiến dấu chấm mang nghĩa ký tự bất kỳ. Ngoài phía tìm kiếm, nội dung thay thế chứa dấu dollar cũng có quy tắc cần được kiểm tra.
Bài đối chiếu MDN ngày 07/11/2026 và chạy ví dụ trên Node.js 24.18.1. Các test chỉ xử lý chuỗi cục bộ; không có benchmark, công cụ regex bên ngoài hay phép đo trên browser cũ. Cả hai method đều trả chuỗi kết quả mới.
So sánh bằng cùng một nhóm tiêu chí
| Tiêu chí | replace | replaceAll |
|---|---|---|
| Pattern là string | Thay lần khớp đầu | Thay mọi lần khớp |
| Pattern là RegExp | Theo cờ của regex | Regex phải có cờ g |
| Chuỗi replacement có $& | Có thể chèn phần khớp | Cũng có quy tắc replacement |
| Replacer function trả text | Dùng text được trả về | Dùng text được trả về ở mỗi lần khớp |
| Sửa chuỗi đầu vào | Không tự sửa | Không tự sửa |
Hai method thuộc JavaScript chuẩn và có sẵn trong Node được thử. Nếu hỗ trợ một runtime khác, kiểm tra compatibility trước khi dùng replaceAll; bài không chứng minh mọi môi trường người đọc đều có cùng khả năng hỗ trợ.
1. Kiểm tra pattern string trước
Chạy ví dụ độc lập sau bằng Node. Dấu chấm được truyền như dữ liệu tìm kiếm thông thường:
const assert = require('node:assert/strict');
const original = 'a.b.c';
assert.equal(original.replace('.', '-'), 'a-b.c');
assert.equal(original.replaceAll('.', '-'), 'a-b-c');
assert.equal(original, 'a.b.c');
assert.equal(original.replace(/./g, '-'), '-----');
assert.equal(original.replace(/\./g, '-'), 'a-b-c');
assert.throws(() => original.replaceAll(/\./, '-'), TypeError);
assert.equal(original.replaceAll(/\./g, '-'), 'a-b-c');
console.log('string and RegExp patterns verified');
Ở RegExp, dấu chấm không escape có ý nghĩa khác dấu chấm literal. Khi nhu cầu chỉ là tìm một chuỗi nguyên văn do người dùng nhập, pattern string giúp tránh việc vô tình diễn giải nó thành cú pháp regex.
Tuy nhiên, pattern literal không khiến mọi đối số của phép thay trở thành text nguyên văn. Đối số replacement dạng string vẫn có các mẫu đặc biệt như $&. Cần kiểm tra cả hai phía của thao tác.
2. Giữ replacement đúng nguyên văn
Ví dụ độc lập tiếp theo dùng replacer function khi muốn chèn đúng các ký tự mà người gọi truyền vào:
const assert = require('node:assert/strict');
function replaceLiteral(text, needle, replacement) {
if (needle === '') throw new RangeError('Needle must not be empty');
return text.replaceAll(needle, () => replacement);
}
assert.equal('a.a'.replaceAll('.', '$&'), 'a.a');
assert.equal(replaceLiteral('a.a', '.', '$&'), 'a$&a');
assert.equal(replaceLiteral('x-x', 'x', '$$'), '$$-$$');
assert.equal(replaceLiteral('a.b.c', '.', '-'), 'a-b-c');
assert.equal(replaceLiteral('abc', 'missing', '-'), 'abc');
assert.throws(() => replaceLiteral('abc', '', '-'), RangeError);
console.log('literal replacement text verified');
Khi function trả chuỗi $&, nó được dùng như text kết quả thay thế, không tiếp tục áp dụng mẫu $& để chèn phần vừa khớp. Helper có hợp đồng nhận ba string; nó không phải validator cho đối tượng tùy ý truyền vào.
Needle rỗng bị từ chối theo chính sách của helper. Đây là lựa chọn của ví dụ để tránh một phép thay bất ngờ ở nhiều vị trí, không phải khẳng định replaceAll chuẩn không chấp nhận string rỗng.
Kiểm tra trên dữ liệu của công cụ sửa text
Giữ các ca không có phần khớp, một phần khớp, nhiều phần khớp và replacement chứa dollar. Nếu cho phép regex do người dùng nhập, đó là một chế độ riêng cần giao diện và quy tắc rõ ràng; đừng tự chuyển mọi pattern string thành new RegExp mà không nói với người dùng.
Phép thay chuỗi này cũng không giải quyết normalization Unicode hay so khớp không phân biệt hoa thường. Nếu cần những quy tắc đó, thêm bước xử lý và test riêng theo ngôn ngữ dữ liệu. Bài chỉ kiểm chứng khớp chuỗi theo các đầu vào đã nêu.
Tiêu chí chọn trong project
Chọn replace khi muốn thay lần đầu hoặc chủ động dùng RegExp theo cờ của nó. Chọn replaceAll khi muốn thay mọi phần khớp của một string literal. Chọn function replacement nếu text thay thế phải được giữ nguyên, nhất là khi nó có thể chứa dollar.
Không kết luận method nào nhanh hơn từ các assertions này. Trước khi đo tốc độ trên tài liệu dài, xác nhận cùng pattern, cùng replacement và cùng kết quả đầu ra. Sự khác nhau về ngữ nghĩa cần được giải quyết trước việc tối ưu một vòng lặp thay text.

