Sự khác biệt giữa encodeURI và encodeURIComponent trong JavaScript

542

Bài viết được sự cho phép của tác giả Phạm Bình

Mình đang viết một bài hướng dẫn sử dụng các hàm JavaScript cơ bản thì gặp phải vấn đề so sánh hai thằng encodeURI() và encodeURIComponent(). Mình có xem qua một vài ví dụ thì thấy nó cứ na ná giống nhau, vì vậy mình quyết định tìm hiểu ký xem chúng thật sự khác nhau chỗ nào.

Vâng, và sau khi phân biệt được, mình đã quyết định viết bài viết này để chia sẻ với các bạn.

I. Encodeuri() và Encodeuricomponent là gì?

Có thể là bạn đã biết rồi, encodeURI() và encodeURIComponent() được sử dụng khi bạn muốn mã hóa >URI từ các ký tự đặc biệt thành ký tự thường. Hay được sử dụng khi bạn muốn gửi một request có tham số mang giá trị là một url hoàn chỉnh.

Ví dụ. Mình có biến url mang giá trị https://phambinh.net?page=10, mình muốn gửi biến này lên server ở endpoint https://domain.com để xử lý theo method get.

  Top 5 tips and tricks hot nhất của JavaScript năm 2023

  Top 10 câu hỏi phỏng vấn JavaScript cực chi tiết

Có thể bạn sẽ nghĩ đơn giản chỉ việc nối chuỗi như sau là đủ:

var url = "https://phambinh.net?page=10";
var endpoint = "https://domain.com?url=" + url;

Nhưng như vậy là chưa đủ, bởi biến url chứa các ký tự đặc biệt như /?. Nên khi nối vào endpoint, bạn sẽ nhận được kết quả thế này:

"https://domain.com?url=https://phambinh.net?page=10"

Đương nhiên với định dạng như trên, web server sẽ không nhận được giá trị của biến url như mong muốn.

Vì vậy mà chúng ta mới cần đến việc encode URI. Đoạn code trên nên được sửa lại như sau:

var url = "https://phambinh.net?page=10";
var endpoint = "https://domain.com?url=" + encodeURI(url);

Lưu ý: Đoạn code trên có sử dụng hàm encodeURI(), tuy nhiên mình vẫn chưa chắc chắn có chính xác hay không, hay là phải sử dụng encodeURIComponent(). Và đây cũng chính là lý do tại sao chúng ta cần bài viết này để phân biệt cách sử dụng chúng.

Tham khảo việc làm JavaScript tại Hồ Chí Minh trên TopDev

II. Sự khác biệt giữa Encodeuri() và Encodeuricomponent()

Không có gì khác biệt quá lớn. Điều tạo nên sự khác biệt nhất chính là:

  • encodeURI() mã hóa các ký tự đặc biệt, ngoại trừ: ~!@#$&*()=:/,;?+
  • encodeURIComponent() mã hóa các ký tự đặc biệt, ngoại trừ: -_.!~*'()

III. Khi nào thì Encodeuri() và khi nào dùng Encodeuricomponent()

Từ sự khác biệt mà mình trình bày ở trên, chúng ta thể rút ngay ra khi nào thì sử dụng encodeURI() và encodeURIComponent() như sau:

  • Khi bạn muốn mã hóa một url đầy đủ (có cả phần http:// hay https://) thì dùng encodeURI(), bởi nó sẽ không mã hóa các ký tự :/.
  • Khi bạn muốn mã hóa giá trị của tham số thì sử dụng encodeURIComponent().

Vậy quay lại ví dụ ở phần I, mình sử dụng encodeURI() là sai, thay vào đó nên sử dụng encodeURIComponent(). Code cuối cùng sẽ là:

var url = "https://phambinh.net?page=10";
var endpoint = "https://domain.com?url=" + encodeURIComponent(url);

console.log(endpoint); // "https://domain.com?url=https%3A%2F%2Fphambinh.net%3Fpage%3D10"

IV. Tổng kết

Chỉ là một bài chia sẻ nhanh, hy vọng sẽ giúp ích cho các bạn trong quá trình >học lập trình JavaScript.

Bài viết gốc được đăng tải tại phambinh.net

Xem thêm các việc làm Developer hấp dẫn tại TopDev

Bài viết liên quan

7 sai lầm lớn khiến việc học Javascript như “nước đổ lá khoai”

Bài viết được sự cho phép của tác giả Sơn Dương Javascript là một trong những ngôn ngữ lập trình phổ biến nhất thế giới. Là công cụ để xây dựng hầu hết những ứng dụng hiện đại trên đủ các nền tảng, từ web tới mobile. Đi kèm với đó là số lượng người học javascript cũng tăng lên chóng mặt. Nhưng việc học javascript online chưa bao giờ là dễ cả. Có một điều đáng buồn là số bạn bỏ cuộc cũng nhiều không kém. Lý do mà họ tự nhủ là: Javascript quá khó học, nó quá mềm dẻo, cú pháp Javascript quá lỏng lẻo… Thậm chí là “có lẽ mình không phù hợp với Javascript“. Thực ra thì việc học javascript online không quá khó như vậy. Nếu không muốn nói là dễ. Chỉ là phương pháp học của bạn có vấn đề mà thôi. Với kinh nghiệm học và hướng dẫn rất nhiều bạn sinh viên, mình đúc kết ra đượ [...]

Kỹ thuật tối ưu Javascript nhằm tăng tốc độ web gấp 2 lần

Bài viết được sự cho phép của tác giả Sơn Dương Khi ứng dụng của bạn ngày càng phát triển với vô số tính năng được thêm vào thì performance luôn là vấn đề nhức nhối. Chẳng hạn như các animation hay transition không được mượt, scroll thì giật hay thậm chí là treo cả UI của ứng dụng. Một trải nghiệm tồi tệ với người dùng! Vậy làm thế nào tối ưu Javascript để tăng tốc độ web? Tất cả đều chỉ ra một điều, ứng dụng bị chậm là khi bạn không thể giữ hiệu năng ứng dụng với tiêu chuẩn cơ bản 60 FPS (khung hình/giây). Hãy thử làm một vài phép toán và xem nó là gì nhé! FPS là gì? Trước khi chúng ta bắt tay vào đo đạc và tối ưu mã nguồn, mình muốn làm rõ khái niệm đã nhắc đến ở trên. Thực sự FPS là gì? FPS là viết tắt của từ Frames per second, dịch nghĩa là: khung hì [...]

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Bài viết được sự cho phép của tác giả Tống Xuân Hoài Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp Giới thiệu về composition function Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo. Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy. Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3. Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này: const add = (a, b) => a + b; const mult = (a, b) => a * b; add(1, mult(2, 3)); Oh! hàm chạy rất tố [...]