Movatterモバイル変換


[0]ホーム

URL:


  1. Tecnología web para desarrolladores
  2. JavaScript
  3. Referencia de JavaScript
  4. Expresiones y operadores
  5. Operador delete

Esta página ha sido traducida del inglés por la comunidad.Aprende más y únete a la comunidad de MDN Web Docs.

View in EnglishAlways switch to English

Operador delete

Baseline Widely available

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

Eloperadordelete de JavaScript remueve una propiedad de un objeto; si no semantienen más referencias a la misma propiedad, eventualmente se libera automáticamente.

Pruébalo

const Employee = {  firstname: "Maria",  lastname: "Sanchez",};console.log(Employee.firstname);// Expected output: "Maria"delete Employee.firstname;console.log(Employee.firstname);// Expected output: undefined

Sintaxis

js
delete expresion;

Dondeexpresion debe evaluarse como una referencia a lapropiedad, por ejemplo:

js
delete object.property;delete object["property"];

Parámetros

object

El nombre de un objeto, o una expresión que evalúa a un objeto.

property

La propiedad a eliminar.

Valor de retorno

true para todos los casos excepto cuando es una propiedadpropiano configurable, en cuyo caso, se retornafalse en modo no estricto.

Excepciones

Arroja unTypeError enmodo estricto si la propiedad es una propiedad directa no configurable.

Descripción

Al contrario de lo que se podría pensar (tal vez debido a otros lenguajes de programación comodelete in C++), el operadordelete no tienenada que ver con liberar memoria.La gestión de memoria se hace de manera indirecta eliminando referencias. Véase la páginagestión de memoria para más detalles.

El operadordelete remueve una propiedad dada de un objeto.En caso de que la eliminación sea exitosa, retornarátrue, en otro casose retornaráfalse.

Sin embargo, es importante considerar los siguientes escenarios:

  • Si la propiedad que está intentando eliminar no existe,deleteno tendrá ningún efecto y retornarátrue.

  • Si una propiedad con el mismo nombre existe en la cadena de prototipos del objeto,entonces, luego de la eliminación, el objeto usará la propiedad de la cadena de prototipos(en otras palabras,delete sólo tiene efecto en los propiedades propias).

  • Cualquier propiedad declarada convar no puede ser eliminadadesde el ámbito global o desde el ámbito de una función.

    • Del mismo modo,delete no puede eliminar ninguna función en el ámbito global (ya sea parte de una definición de una función o una expresión de función).
    • Funciones que son partes de un objeto (y no sean del ámbito global) sí pueden ser eliminadas condelete.
  • Las propiedades declaradas conlet oconst no pueden ser eliminadas dentro delámbito en el cual fueron definidas.

  • Las propiedades no configurables no pueden ser removidas. Esto incluye laspropiedades de objetos incorporados a JavaScript comoMath,Array,Object y propiedades que son creadas comono configurables con métodos comoObject.defineProperty().

El siguiente bloque de código muestra un ejemplo simple:

js
var Employee = {  age: 28,  name: "abc",  designation: "desarrollador",};console.log(delete Employee.name); // retorna trueconsole.log(delete Employee.age); // retorna true// Cuando se trata de eliminar una propiedad// que no existe, retorna trueconsole.log(delete Employee.salary); // retorna true

Propiedades no configurables

Cuando una propiedad es marcada como no configurable,delete no tendráningún efecto, y retornaráfalse. En modo estricto esta situaciónarrojará unTypeError.

js
var Employee = {};Object.defineProperty(Employee, "name", { configurable: false });console.log(delete Employee.name); // retorna false

var,let, yconst crean propiedades no configurablesque no pueden ser eliminadas con el operadordelete:

js
var nameOther = "XYZ";// Podemos acceder a esta propiedad global usando:Object.getOwnPropertyDescriptor(window, "nameOther");// salida: Object {value: "XYZ",//                  writable: true,//                  enumerable: true,//                  configurable: false}// Debido a que "nameOther" es añadido usando la palabra// reservada var, es marcada como "no configurable"delete nameOther; // retorna false

En modo estricto, esto hubiese arrojado una excepción.

Modo estricto vs. no estricto

En modo estricto, sidelete es usado en referencia directa a una variable,un argumento de función o un nombre de función, arrojará unSyntaxError. Por lo tanto, para evitar errores de sintaxisen modo estricto, debe usar el operadordelete en la forma dedelete object.property odelete object['property'].

js
Object.defineProperty(globalThis, "variable1", {  value: 10,  configurable: true,});Object.defineProperty(globalThis, "variable2", {  value: 10,  configurable: false,});// SyntaxError en modo estricto.console.log(delete variable1); // true// SyntaxError en modo estricto.console.log(delete variable2); // false
js
function func(param) {  // SyntaxError en modo estricto.  console.log(delete param); // false}// SyntaxError en modo estricto.console.log(delete func); // false

Notas entre navegadores

Según la especificación moderna de ECMAScript, el orden de recorrido de laspropiedades de un objeto está bien definido y es estable a través de lasimplementaciones. No obstante, en el caso de Internet Explorer, cuando unousadelete en una propiedad, resulta en un comportamiento confuso,impidiendo que otros navegadores utilicen objetos simples comoliterales de objeto como si fuesen arreglos asociativos ordenados.En Internet Explorer, mientras que la propiedadvalue es de hecho establecidacomoundefined, si uno luego añade una propiedad con el mismo nombre, lapropiedad será iterada en su posiciónanterior y no al final de la secuencia comouno esperaría luego de haber eliminado la propiedad y agregarla nuevamente.

Si usted desea usar un arreglo asociativo ordenado con soporte paraimplementaciones antiguas, use un objetoMap si está disponible(a través de unpolyfill, por ejemplo), o simule esta estructura con dosarreglos separados (uno para las claves y otro para los valores), o construyaun arreglo de objetos con una única propiedad, etc.

Ejemplos

js
// Crea la propiedad adminName en el ámbito global.adminName = "xyz";// Crea la propiedad empCount en el ábmti global.// Como se usa var, es marcada como no configurable.// Lo mismo es cierto para let y const.var empCount = 43;EmployeeDetails = {  name: "xyz",  age: 5,  designation: "Developer",};// adminName es una propiedad del ámbito global.// Puede ser eliminada debido a que es declarada sin usar var,// y por lo tanto es configurable.delete adminName; // retorna true// Por el contrario, empCount no es configurable// debido a que fue usado var al declararla.delete empCount; // retorna false// delete puede ser usado para eliminar propiedades de objetos.delete EmployeeDetails.name; // retona true// Incluso cuando la propiedad no existe, delete retorna "true".delete EmployeeDetails.salary; // retorna true// delete no afecta propiedades estáticas propias del lenguaje.delete Math.PI; // retorna false// EmployeeDetails es una propiedad del ámbito global.// Debido a que fue definida sin "var", se marca como configurable.delete EmployeeDetails; // retorna truefunction f() {  var z = 44;  // delete no afecta nombres de variables locales  delete z; // retorna false}

delete y la cadena de prototipos

En el siguiente ejemplo, se elimina una propiedad directa de un objeto mientrasque una propiedad con el mismo nombre está disponible en la cadena deprototipos:

js
function Foo() {  this.bar = 10;}Foo.prototype.bar = 42;var foo = new Foo();// foo.bar está asociado con la// propiedad directa.console.log(foo.bar); // 10// Eliminar la propiedad directa// del objeto foo.delete foo.bar; // retorna true// foo.bar aún está disponible en// la cadena de prototipos.console.log(foo.bar); // 42// Eliminar la propiedad en el prototipo.delete Foo.prototype.bar; // retorna true// La propiedad "bar" ya no puede ser heredada// de foo ya que ha sido eliminada.console.log(foo.bar); // undefined

Eliminando elementos de arreglos

Cuando se elimina un elemento de un arreglo, la propiedadlength no se veafectada. Se mantiene incluso si se elimina el último elemento del arreglo.

Cuando el operadordelete elimina un elemento de un array, ese elementono se encuentra más en el mismo. En el siguiente ejemplo,trees[3] eseliminado con el uso dedelete.

js
var trees = ["redwood", "bay", "cedar", "oak", "maple"];delete trees[3];if (3 in trees) {  // esto no se ejecuta}

Si desea que un elemento de un arreglo exista pero que no tenga un valordefinido, use el valorundefined en lugar del operadordelete. En elsiguiente ejmeplo,trees[3] recibe el valorundefined, pero el elementodel arreglo aún existe:

js
var trees = ["redwood", "bay", "cedar", "oak", "maple"];trees[3] = undefined;if (3 in trees) {  // esto sí se ejecuta}

Si en lugar de eso, usted desea eliminar un elemento de un arreglo cambiandolos contenidos del mismo, use el métodosplice(). En el siguiente ejemplo,se elimina completamentetrees[3] del arreglo usandosplice():

js
var trees = ["redwood", "bay", "cedar", "oak", "maple"];trees.splice(3, 1);console.log(trees); // ["redwood", "bay", "cedar", "maple"]

Especificaciones

Specification
ECMAScript® 2026 Language Specification
# sec-delete-operator

Compatibilidad con navegadores

Véase también

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp