En ES3, la eliminación se introduce en 8.6.2.5 y 11.4.1, de la siguiente manera
Hay alguna información,
1. El operador de eliminación en la implementación llamará al método [[Delete]] dentro del motor.
2. [[Eliminar]] se define en 8.6.2
3. El atributo eliminado tiene la función DontDelete. Si es así, se devolverá falso directamente al eliminar.
Busque "DontDelete" y encontrará muchos. Ninguno de los siguientes se puede eliminar.
1. Activar los argumentos objeto del objeto (10.1.6)
Copie el código de código de la siguiente manera:
función función() {
eliminar argumentos;
alerta(argumentos);
}
función(1);
2. Declaración de variables (10.2.1)
Copie el código de código de la siguiente manera:
var a = 10;
eliminar un;
alerta(a); // 10
Este elemento se menciona en muchos libros de JS, es decir, las variables declaradas usando var no se pueden eliminar.
3. Declaración de función
Copie el código de código de la siguiente manera:
función función() {}
eliminar función;
alerta(función); // código de función
4. El atributo de longitud de la función.
Copie el código de código de la siguiente manera:
función función (a, b) {}
eliminar función.longitud;
alerta(func.longitud); // 2
5. Algunas constantes (NaN, Infinity, indefinida)
Copie el código de código de la siguiente manera:
eliminar NaN; // falso
eliminar infinito; // falso
eliminar indefinido; // falso
6. Prototipo de constructor incorporado.
Copie el código de código de la siguiente manera:
eliminar objeto.prototipo; // falso
eliminar función.prototipo; // falso
eliminar Array.prototipo; // falso
eliminar ExpReg.prototipo; // falso
eliminar Fecha.prototipo; falso //
eliminar Error.prototipo; falso //
eliminar Número.prototipo; // falso
eliminar booleano.prototipo; // falso
eliminar String.prototype; // falso
7. La longitud de matrices y cadenas.
Copie el código de código de la siguiente manera:
var arr = [], str = 'hola';
eliminar longitud de arr;
eliminar cadena.longitud; // falso
8. Propiedades del objeto Math (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
Copie el código de código de la siguiente manera:
eliminar Math.E; // falso
...
9. Propiedades de objetos regulares (fuente, global, ignoreCase, multiline, lastIndex)
Copie el código de código de la siguiente manera:
var reg = /ss/;
eliminar reg.source;
...
ES5 es diferente de ES3. No hay "DontDelete" en ES5, pero se agrega [[Configurable]] (8.6.1).
Si el valor es falso, no se puede eliminar. Los nueve puntos enumerados anteriormente se describen en ES5 como [[Configurable]] es falso.
El nuevo método Object.defineProperty en ES5 puede mostrar el configurable del objeto definido, de la siguiente manera
Copie el código de código de la siguiente manera:
var obj = {nombre: 'Juan'};
Object.defineProperty(obj, "clave", {
configurable: falso,
valor: "estático"
});
eliminar obj.nombre; // verdadero
eliminar obj.key // falso
El objeto obj tiene nombre y clave. El nombre se puede eliminar, pero la clave no.
Además, en el modo estricto de ES5, se generará una excepción directamente al eliminar un objeto cuyo configurable sea falso. como
Copie el código de código de la siguiente manera:
"uso estricto";
eliminar Objeto.prototipo;
El error de la consola en FF es el siguiente:
Además de algunos métodos o propiedades de objetos integrados que no se pueden eliminar, también existen objetos personalizados que no se pueden eliminar. Por ejemplo, eliminar no puede eliminar un objeto que hereda propiedades del prototipo.
Copie el código de código de la siguiente manera:
función Persona() {}
Persona.prototipo.nombre = 'John Backus';
var p = nueva Persona();
eliminar p.nombre;
console.log(p.name); // Todavía genera John Backus
Si hay un nombre en esto y un prototipo, luego de eliminarlo, se mostrará el prototipo.
Copie el código de código de la siguiente manera:
función Persona() {
this.nombre = 'John Backus';
}
Persona.prototype.name = 'John Resig';
var p = nueva Persona();
console.log(p.nombre); // John Backus
eliminar p.nombre;
console.log(p.name); // John Resig, del prototipo
Si tiene que eliminar el nombre en el prototipo, sólo podrá
Copie el código de código de la siguiente manera:
eliminar Persona.prototipo.nombre
Para resumir:
1. La mayoría de las propiedades y métodos de los objetos integrados no se pueden eliminar (aunque algunos sí se pueden eliminar, como isNaN y parseInt)
2. Las propiedades y métodos que un objeto hereda del prototipo no se pueden eliminar.
La razón también es muy simple,
1. La mayoría de las propiedades y métodos de los objetos integrados no se pueden eliminar para proteger la API principal del lenguaje. Una vez que se eliminan estas API, son básicamente inútiles. Como eliminar Object.prototype.
2. Los atributos y métodos que un objeto hereda del prototipo no se pueden eliminar para proteger el prototipo. De lo contrario, "si un objeto de clase A elimina un atributo en el prototipo, todos los objetos heredados de A perderán el atributo".