解析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 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
JQuery的Validation插件中Remote验证的中文问题
Jul 26 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
jquery更换文章内容与改变字体大小代码
Sep 30 Javascript
node.js中的fs.futimesSync方法使用说明
Dec 17 Javascript
Node.js 异步编程之 Callback介绍(一)
Mar 30 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
Mar 19 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
Jul 17 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
使用Angular material主题定义自己的组件库的配色体系
Sep 04 Javascript
Element DateTimePicker日期时间选择器的使用示例
Jul 27 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
Oct 23 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 读取文件乱码问题
2010/02/20 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
后勤人员自我评价怎么写
2013/09/19 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
会议主持词开场白
2015/05/28 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript