Trong JavaScript, cả shimpolyfill đều liên quan đến việc thêm chức năng mới vào các môi trường không hỗ trợ các tính năng nhất định của ngôn ngữ. Tuy nhiên, chúng có sự khác biệt về cách hoạt động và mục đích.

1. Shim

Shim là một đoạn mã cung cấp một API mà môi trường không hỗ trợ bằng cách mô phỏng hành vi của tính năng hoặc sửa đổi một API hiện có. Nó thay thế hoặc cải tiến chức năng sẵn có nhưng không có nghĩa là phải tuân thủ đúng đặc tả hoặc API hiện có của tiêu chuẩn mới.

Đặc điểm:

  • Có thể cung cấp hoặc thay thế một tính năng bằng cách sử dụng các phương pháp khác nhau, không nhất thiết phải là phiên bản chính xác của tiêu chuẩn.
  • Thường bao gồm cả các thay đổi để mô phỏng một API đã có sẵn, có thể thay đổi hành vi hiện tại của đối tượng hoặc phương thức.

Ví dụ:

Giả sử môi trường không hỗ trợ Array.prototype.forEach, một shim có thể được viết như sau:

if (!Array.prototype.forEach) {
  Array.prototype.forEach = function(callback) {
    for (let i = 0; i < this.length; i++) {
      callback(this[i], i, this);
    }
  };
}

Ở đây, shim mô phỏng cách forEach hoạt động trên các môi trường không hỗ trợ nó.

2. Polyfill

Polyfill là một đoạn mã (thường là thư viện) được thêm vào để cung cấp các chức năng hiện đại mà môi trường không hỗ trợ, với mục tiêu chính là tái tạo chính xác các API theo đặc tả mới. Polyfill bám sát vào các đặc tả của tiêu chuẩn mới và bổ sung tính năng thiếu.

Đặc điểm:

  • Cung cấp một giải pháp thay thế chính xác tuân theo đặc tả API tiêu chuẩn.
  • Được sử dụng phổ biến để thêm các tính năng JavaScript hiện đại vào các trình duyệt hoặc môi trường cũ không hỗ trợ.
  • Không thay đổi hành vi của các tính năng hiện có, chỉ bổ sung các tính năng thiếu.

Ví dụ:

Giả sử bạn muốn sử dụng tính năng Promise trong một trình duyệt không hỗ trợ:

if (!window.Promise) {
  window.Promise = function() {
    // Một triển khai đơn giản của Promise
  };
}

Polyfill này kiểm tra nếu Promise không có sẵn, nó sẽ bổ sung chức năng này để tương thích với các môi trường không hỗ trợ.

Sự Khác Biệt Giữa Shim và Polyfill

Tiêu Chí Shim Polyfill
Mục Đích Cung cấp hoặc thay thế một tính năng bằng cách mô phỏng, có thể thay đổi hành vi hiện có. Tái tạo chính xác một tính năng hiện đại theo tiêu chuẩn mới nếu môi trường không hỗ trợ.
Phạm Vi Thay Đổi Có thể thay đổi hành vi của API hoặc đối tượng hiện có. Chỉ thêm các tính năng không có sẵn, không thay đổi API hiện có.
Tuân Thủ Đặc Tả Không nhất thiết phải tuân theo đặc tả chính thức. Tuân thủ chặt chẽ đặc tả API theo tiêu chuẩn hiện đại.

Kết Luận

  • Shim thường dùng để mô phỏng hoặc thay đổi một API sẵn có, có thể không tuân theo tiêu chuẩn cụ thể.
  • Polyfill đảm bảo cung cấp đầy đủ và chính xác các tính năng hiện đại không có trong môi trường cũ, tuân thủ theo đúng đặc tả.

Shim có thể linh hoạt hơn khi áp dụng thay đổi hành vi hiện có, trong khi polyfill là giải pháp chính xác để hỗ trợ tính năng hiện đại.