解析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 相关文章推荐
QQ登录简单实现代码
Mar 09 Javascript
js获取class的所有元素
Mar 28 Javascript
jquery实现手机发送验证码的倒计时代码
Feb 12 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 Javascript
js装饰设计模式学习心得
Feb 17 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
安装vue-cli的简易过程
May 22 Javascript
详解vue-cli下ESlint 配置说明
Sep 03 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
Sep 14 Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
Jun 11 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脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
详解python中的json和字典dict
2018/06/22 Python
python删除字符串中指定字符的方法
2018/08/13 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Python3远程监控程序的实现方法
2019/07/15 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
大学生自我鉴定
2013/12/16 职场文书
高校十八大报告感想
2014/01/27 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL