Array.prototype[Symbol.unscopables]

Thuộc tính dữ liệu [Symbol.unscopables] của Array.prototype được chia sẻ bởi tất cả các đối tượng Array. Nó chứa các tên thuộc tính không được đưa vào tiêu chuẩn ECMAScript trước phiên bản ES2015 và bị bỏ qua cho mục đích ràng buộc câu lệnh with.

Giá trị

Một đối tượng có prototype null với các tên thuộc tính được liệt kê bên dưới và giá trị của chúng được đặt thành true.

Property attributes of Array.prototype[Symbol.unscopables]
Writableno
Enumerableno
Configurableyes

Mô tả

Các thuộc tính Array mặc định bị bỏ qua cho mục đích ràng buộc câu lệnh with là:

Array.prototype[Symbol.unscopables] là một đối tượng rỗng chỉ chứa tất cả các tên thuộc tính trên với giá trị true. Prototype của nó là null, vì vậy các thuộc tính Object.prototype như toString sẽ không vô tình bị đánh dấu là unscopable, và toString() trong câu lệnh with sẽ tiếp tục được gọi trên mảng.

Xem Symbol.unscopables để biết cách đặt thuộc tính unscopable cho các đối tượng của riêng bạn.

Ví dụ

Hãy tưởng tượng lệnh gọi values.push('something') bên dưới là trong code được viết trước ECMAScript 2015.

js
var values = [];

with (values) {
  values.push("something");
}

Khi ECMAScript 2015 giới thiệu phương thức Array.prototype.values(), câu lệnh with trong code trên bắt đầu hiểu values là phương thức mảng values.values thay vì biến values bên ngoài. Lệnh gọi values.push('something') sẽ bị lỗi vì nó hiện đang truy cập push trên phương thức values.values. Điều này gây ra một lỗi được báo cáo cho Firefox (Firefox Bug 883914).

Vì vậy, thuộc tính dữ liệu [Symbol.unscopables] cho Array.prototype khiến các thuộc tính Array được giới thiệu trong ECMAScript 2015 bị bỏ qua cho mục đích ràng buộc câu lệnh with — cho phép code được viết trước ECMAScript 2015 tiếp tục hoạt động như mong đợi, thay vì bị lỗi.

Thông số kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-array.prototype-%symbol.unscopables%

Khả năng tương thích với trình duyệt

Xem thêm