这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要是对 JavaScript 中 delete 操作符不能删除的对象进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
ES3 中,delete 在 8.6.2.5 及 11.4.1 有介绍,如下
有一些信息,
1、实现上 delete 操作符会调用引擎内部的 [[Delete]] 方法
2、[[Delete]] 在 8.6.2 里定义
3、删除的属性有个 DontDelete 的特性,如果有,delete 时直接返回 false
搜索 "DontDelete",会发现有很多,如下都不能 delete
1, 激活对象的 arguments 对象 (10.1.6)
- function func() {
- delete arguments;
- alert(arguments);
- }
- func(1);
2,变量声明 (10.2.1)
- var a = 10;
- delete a;
- alert(a); // 10
这一条在很多 JS 书里有提及,即不能 delete 掉使用 var 声明的变量。
3,函数声明
- function func() {}
- delete func;
- alert(func); // func code
4,函数的 length 属性
- function func(a, b) {}
- delete func.length;
- alert(func.length); // 2
5,一些常量(NaN、Infinity、undefined)
- delete NaN; // false
- delete Infinity; // false
- delete undefined; // false
6,内置构造器的 prototype
- delete Object.prototype; // false
- delete Function.prototype; // false
- delete Array.prototype; // false
- delete ExpReg.prototype; // false
- delete Date.prototype; // false
- delete Error.prototype; // false
- delete Number.prototype; // false
- delete Boolean.prototype; // false
- delete String.prototype; // false
7, 数组和字符串的 length
- var arr = [],
- str = 'hello';
- delete arr.length; // false
- delete str.length; // false
8,Math 对象的属性(Math.E、Math.LN10、Math.LN2、Math.LOG2E、Math.LOG10E、Math.PI、Math.SQRT1_2、Math.SQRT2)
- delete Math.E; // false
- ...
9,正则对象的属性(source、global、ignoreCase、multiline、lastIndex)
- var reg = /ss/;
- delete reg.source; // false
- ...
ES5 与 ES3 不同,ES5 中没有 "DontDelete",却增加了 [[Configurable]] (8.6.1)。
如果该值为 false,则不能 delete,以上列举的 9 点在 ES5 中描述为 [[Configurable]] 为 false。
ES5 新增的 Object.defineProperty 方法可显示的定义对象的 Configurable,如下
- var obj = {
- name: 'John'
- };
- Object.defineProperty(obj, "key", { configurable: false,
- value: "static"
- });
- delete obj.name; // true
- delete obj.key // false
对象 obj 有 name,key。name 可以 delete,key 则不行。
此外 ES5 严格模式中 delete configuable 为 false 的对象时会直接抛异常。如
- "use strict";
- delete Object.prototype;
FF 中控制台报错如下
除了内置对象的一些方法或属性不能删除外,自定义对象也有不能删除的。如 delete 不能删除对象继承来自原型上的属性
- function Person() {}
- Person.prototype.name = 'John Backus';
- var p = new Person();
- delete p.name;
- console.log(p.name); // 仍然输出 John Backus
如果 this 和 prototype 上都有 name,那么 delete 后,会将 prototype 上的呈现出来
- function Person() {
- this.name = 'John Backus';
- }
- Person.prototype.name = 'John Resig';
- var p = new Person();
- console.log(p.name); // John Backus
- delete p.name;
- console.log(p.name); // John Resig, 来自原型
如果非要删除原型上的 name,只能
总结下:
- delete Person.prototype.name
1,内置对象的属性及方法多数不能 delete(虽然有些能 delete,如 isNaN、parseInt)
2,对象继承于原型的属性和方法不能 delete
原因也很简单,
1,内置对象的属性及方法多数不能 delete 保护该语言最核心 API,这些 API 被 delete 了,基本上就废了。如 delete Object.prototype。
2,对象继承于原型的属性和方法不能 delete 是出于保护原型,否则 "类 A 的对象 delete 了原型上的属性,那么继承于 A 的都将丢失该属性"。
来源: http://www.phperz.com/article/17/0423/278045.html