解析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 相关文章推荐
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
May 08 Javascript
angularJS 入门基础
Feb 09 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
vue2.0 keep-alive最佳实践
Jul 06 Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 Javascript
微信小程序模板template简单用法示例
Dec 04 Javascript
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
微信小程序云开发获取文件夹下所有文件(推荐)
Nov 14 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 Javascript
vue 扩展现有组件的操作
Aug 14 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
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
javascript实现评分功能
2020/06/24 Javascript
js实现点击烟花特效
2020/10/14 Javascript
浅谈Python中range和xrange的区别
2017/12/20 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
自荐信格式范文
2013/10/07 职场文书
网站编辑求职信
2013/10/17 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
大学班级文化建设方案
2014/05/06 职场文书
社区娱乐活动方案
2014/08/21 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
八年级语文教学反思
2016/03/03 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏