Symbol.unscopables

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.

El símbolo conocido como Symbol.unscopables se utiliza para especificar un valor de objeto cuyos nombres de propiedades propias y heredadas se excluyen de los enlaces de entorno with del objeto asociado.

Pruébalo

Descripción

El símbolo @@unscopables (Symbol.unscopables) puede definirse en cualquier objeto para excluir los nombres de propiedades de ser expuestos como variables léxicas en los enlaces de entorno with. Tenga en cuenta que si utiliza Modo estricto, las declaraciones with no están disponibles y probablemente tampoco necesiten este símbolo.

Establecer una propiedad a true en un objeto unscopable la hará unscopable y por tanto no aparecerá en las variables de ámbito léxico. Establecer una propiedad a false la hará scopable y por lo tanto aparecerá en las variables de ámbito léxico.

Atributos de la propiedad Symbol.unscopables
Sobrescribir No
Numerable No
Configurable No

Ejemplos

Scoping con sentencias

El siguiente código funciona bien en ES5 y posteriores. Sin embargo, en ECMAScript 2015 y posteriores, se introdujo el método Array.prototype.keys(). Eso significa que dentro del entorno with "keys" sería ahora el método y no la variable. Fue entonces cuando se introdujo el símbolo unscopable. Un ajuste incorporado de unscopables se implementa como Array.prototype[@@unscopables] para evitar que algunos de los métodos de Array se encuentren dentro de la declaración with.

js
const keys = [];

with (Array.prototype) {
  keys.push("something");
}

Object.keys(Array.prototype[Symbol.unscopables]);
// ["copyWithin", "entries", "fill", "find", "findIndex",
//  "includes", "keys", "values"]

Unscopables en objetos

También puede establecer unscopables para sus propios objetos.

js
const obj = {
  foo: 1,
  bar: 2,
};

obj[Symbol.unscopables] = {
  foo: false,
  bar: true,
};

with (obj) {
  console.log(foo); // 1
  console.log(bar); // ReferenceError: bar is not defined
}

Especificaciones

Specification
ECMAScript Language Specification
# sec-symbol.unscopables

Compatibilidad con navegadores

BCD tables only load in the browser

Véase también