解析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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
jquery判断至少有一个checkbox被选中的方法
Jun 05 Javascript
超实用的JavaScript表单代码段
Feb 26 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
vue2 router 动态传参,多个参数的实例
Nov 10 Javascript
Vue 换肤的示例实践
Jan 23 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 Javascript
基于脚手架创建Vue项目实现步骤详解
Aug 03 Javascript
vue中可编辑树状表格的实现代码
Oct 31 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
帅气的琦玉老师
2020/03/02 日漫
php不用正则采集速度探究总结
2008/03/24 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
Symfony查询方法实例小结
2017/06/28 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python实现随机梯度下降法
2020/03/24 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
《盲人摸象》教学反思
2014/02/16 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
实习证明格式范文
2014/10/14 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
MySQL 数据类型详情
2021/11/11 MySQL