- JavaScript vẫn tiếp tục phát triển trong năm 2025, và có những tính năng tuy chưa quá nổi tiếng nhưng lại rất hữu ích
- Các phương thức trợ giúp Iterator mới hoạt động hiệu quả bộ nhớ hơn nhiều khi biến đổi dữ liệu quy mô lớn
- Có
at()để truy cập từ cuối mảng, cách dùngPromise.withResolvers()đơn giản hơn, cùngstructuredClone()để sao chép sâu - Các phép toán tập hợp cho Set, hàm gắn thẻ cho template string và cách dùng WeakMap/WeakSet vẫn là những phần bị nhiều lập trình viên bỏ qua
Phương thức Iterator Helper
- Nếu chain như
arr.filter().map()trước đây thì mỗi bước đều tạo ra một mảng mới nên kém hiệu quả - Có thể cải thiện bằng chain dựa trên iterator như
arr.values().drop(10).take(10).map(...).toArray() - Các phương thức chính:
drop(): bỏ qua n phần tử đầu tiêntake(): chỉ lấy n phần tử đầu tiênfilter(),map(),flatMap(): hoạt động tương tự các phương thức của mảngreduce(),some(),every(),find(): hỗ trợ kiểm tra điều kiện và tính toán tích lũytoArray(): chuyển thành mảng ở bước cuối
- Safari bắt đầu hỗ trợ từ ngày 31/03/2025, nhưng hiện vẫn chưa được mọi trình duyệt hỗ trợ
Array at()
arr.at(n)tương tựarr[n], nhưng có thể dùng chỉ số âm để truy cập từ cuối- Ví dụ:
[10, 20, 30].at(-1)→30 - Có thể truy cập phần tử cuối mà không cần cách bất tiện như
arr[arr.length - 1]
Promise.withResolvers()
- Cách cũ: lưu
resolve/rejectbên ngoài trongnew Promise((resolve, reject) => { ... }) - Giờ có thể dùng:
const { promise, resolve, reject } = Promise.withResolvers()để viết ngắn gọn và trực quan hơn
Tận dụng callback của String.replace()
- Đối số thứ hai của
replace()vàreplaceAll()không chỉ nhận chuỗi mà còn nhận hàm callback - Ví dụ:
"X, X, X".replaceAll("X", (match, i) => match + i)→"X0, X3, X6" - Có thể thực hiện nhiều kiểu thay thế trong một lần → hiệu quả hơn về hiệu năng và bộ nhớ
Hoán đổi biến (Swap)
- Cách cũ: dùng biến
temp - Cách ngắn gọn: dùng
[a, b] = [b, a]để hoán đổi bằng array destructuring
structuredClone()
- Thay vì
JSON.stringify()+JSON.parse(), hàm này hỗ trợ sao chép sâu chính xác và hiệu quả hơn - Ưu điểm:
- Hỗ trợ cả
NaN,undefined,bigint, v.v. - Có thể sao chép an toàn cả tham chiếu vòng
- Hiệu quả hơn về bộ nhớ và tốc độ với các đối tượng lớn
- Hỗ trợ cả
Tagged Template Literals
- Có thể parse template string bằng một hàm cụ thể
- Hữu ích cho hậu xử lý chuỗi động như escape HTML
- Ví dụ:
hàm gắn thẻescapeHtmlvới<br> ${'<br>'}→<br> &lt;br&gt;
WeakMap / WeakSet
- Tương tự
Map,Setthông thường, nhưng:- Chỉ cho phép object làm key (không chấp nhận giá trị nguyên thủy)
- Tự động bị loại bỏ khi trở thành đối tượng của GC
- Phù hợp khi có khả năng xảy ra tham chiếu vòng hoặc khi cần lưu metadata cho object mà không tạo tác dụng phụ
Hỗ trợ các phép toán tập hợp cho Set
Trong JavaScript, nhiều phép toán logic mới đã được bổ sung cho đối tượng Set:
difference(): hiệu tập hợp (A - B)intersection(): giao tập hợp (A ∩ B)union(): hợp tập hợp (A ∪ B)symmetricDifference(): hiệu đối xứng (A △ B)isDisjointFrom(): có hay không phần tử giao nhauisSubsetOf(): có phải là tập con hay khôngisSupersetOf(): có phải là tập cha hay không
4 bình luận
Có vẻ như vấn đề khi phân tích literal khiến cả biến cũng bị xuất ra dưới dạng chuỗi đã được giải quyết rồi. Cảm ơn bạn đã chia sẻ.
Ví dụ:
"X, X, X".replaceAll("X", (match, i) => match + i) → "X0, X1, X2"Ví dụ này bị sai.
ichứa vị trí khớp.Vì vậy, giá trị kết quả là
"X0, X3, X6".À đúng thật. AI đã tạo ví dụ sai. Tôi đã sửa lại rồi. Cảm ơn bạn đã chỉ ra rất tinh ý!
valuescho cảm giác giống Java Stream API, nên khi so sánh thử thì thấy nếu kích thước mảng nhỏ, lọc trực tiếp không dùngvaluessẽ nhanh hơn. Vì nó dựa trên iterator, nên có vẻ chuỗi gọi càng dài thì cách đi quavaluesmột lần lại càng có lợi về tốc độ. Có thể tham khảo benchmark tại https://jsperf.app/dixutu.