解析JavaScript中delete操作符不能删除的对象


Posted in Javascript onDecember 03, 2013

ES3 中,delete在8.6.2.5及11.4.1有介绍,如下

解析JavaScript中delete操作符不能删除的对象

解析JavaScript中delete操作符不能删除的对象

有一些信息,

1、实现上delete操作符会调用引擎内部的[[Delete]]方法

2、[[Delete]]在8.6.2里定义

解析JavaScript中delete操作符不能删除的对象

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)。

解析JavaScript中delete操作符不能删除的对象

如果该值为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中控制台报错如下

解析JavaScript中delete操作符不能删除的对象

除了内置对象的一些方法或属性不能删除外,自定义对象也有不能删除的。如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的都将丢失该属性”。

Javascript 相关文章推荐
js中各浏览器中鼠标按键值的差异
Apr 07 Javascript
jQuery load方法用法集锦
Dec 06 Javascript
多种方式实现JS调用后台方法进行数据交互
Aug 20 Javascript
js中键盘事件实例简析
Jan 10 Javascript
jquery复选框多选赋值给文本框的方法
Jan 27 Javascript
AngularJs中route的使用方法和配置
Feb 04 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
Jun 07 Javascript
javaScript+turn.js实现图书翻页效果实例代码
Feb 16 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
Sep 03 Javascript
vue各种事件监听实例(小结)
Jun 24 Javascript
微信小程序自定义扫码功能界面的实现代码
Jul 02 Javascript
如何在CocosCreator里画个炫酷的雷达图
Apr 16 Javascript
解析Javascript小括号“()”的多义性
Dec 03 #Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 #Javascript
jquery将一个表单序列化为一个对象的方法
Dec 02 #Javascript
jQuery获得内容和属性方法及示例
Dec 02 #Javascript
jquery如何实现锚点链接之间的平滑滚动
Dec 02 #Javascript
jquery通过a标签删除table中的一行的代码
Dec 02 #Javascript
jQuery判断checkbox是否选中的小例子
Dec 02 #Javascript
You might like
人族 Terran 魔法与科技
2020/03/14 星际争霸
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
python实现查询苹果手机维修进度
2015/03/16 Python
Python中内置的日志模块logging用法详解
2016/07/12 Python
python类的继承实例详解
2017/03/30 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
pandas通过loc生成新的列方法
2018/11/28 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
pandas中的series数据类型详解
2019/07/06 Python
python滑块验证码的破解实现
2019/11/10 Python
python中Django文件上传方法详解
2020/08/05 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
2014年开学第一课活动方案
2014/03/06 职场文书
环保建议书500字
2014/05/14 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
vue实现拖拽交换位置
2022/04/07 Vue.js