解析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 解决表单仍然提交即使监听处理函数返回false
Mar 14 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
Jan 08 Javascript
javascript:void(0)的问题使用探讨
Apr 10 Javascript
理解javascript中的with关键字
Feb 15 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
socket.io学习教程之基本应用(二)
Apr 29 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
May 26 jQuery
vue限制输入框只能输入8位整数和2位小数的代码
Nov 06 Javascript
重置Redux的状态数据的方法实现
Nov 18 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 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+javascript液晶时钟
2006/10/09 PHP
php email邮箱正则
2008/10/08 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
Python验证企业工商注册码
2015/10/25 Python
python类的继承实例详解
2017/03/30 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python获取中文字符串长度的方法
2018/11/14 Python
int在python中的含义以及用法
2019/06/27 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
英国健身专家:WIT Fitness
2021/02/09 全球购物
运动会稿件50字
2014/02/17 职场文书
家长学校实施方案
2014/03/15 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
社区班子对照检查材料
2014/08/27 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
六五普法学习心得体会
2016/01/21 职场文书
Python数组变形的几种实现方法
2022/05/30 Python