The @@unscopables data property contains property names that were not included in the ECMAScript standard prior to the ES2015 version and that are ignored for with statement-binding purposes.


The default Array properties that are ignored for with statement-binding purposes are:

Array.prototype[@@unscopables] is an empty object only containing all the above property names with the value true. Its prototype is null, so Object.prototype properties like toString won't accidentally be made unscopable, and a toString() within the with statement will continue to be called on the array.

See Symbol.unscopables for how to set unscopable properties for your own objects.

Property attributes of Array.prototype[@@unscopables]
Writable no
Enumerable no
Configurable yes


Imagine the keys.push('something') call below is in code that was written prior to ECMAScript 2015.

var keys = [];

with (Array.prototype) {

When ECMAScript 2015 introduced the Array.prototype.keys() method, if the @@unscopables data property had not also been introduced, that keys.push('something') call would break — because the JavaScript runtime would have interpreted keys as being the Array.prototype.keys() method, rather than the keys array defined in the example code.

So the @@unscopables data property for Array.prototype causes the Array properties introduced in ECMAScript 2015 to be ignored for with statement-binding purposes — allowing code that was written prior to ECMAScript 2015 to continue working as expected, rather than breaking.


ECMAScript Language Specification
# sec-array.prototype-@@unscopables

Browser compatibility

BCD tables only load in the browser

See also