解析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之大字符串的连接的StringBuffer 类
May 08 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
Oct 28 Javascript
JavaScript 是什么意思
Sep 22 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
Sep 25 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 Javascript
JavaScript实现简单进度条效果
Mar 25 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
JS实现简易图片自动轮播
Oct 16 Javascript
React中使用Vditor自定义图片详解
Dec 25 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文件的实现方法
2007/03/19 PHP
第六章 php目录与文件操作
2011/12/30 PHP
fgetcvs在linux的问题
2012/01/15 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
动态加载js的几种方法
2006/10/23 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
动态创建类实例代码
2009/10/07 Python
Python中关于字符串对象的一些基础知识
2015/04/08 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python set内置函数的具体使用
2019/07/02 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
英国女装网上商店:I Saw It First
2018/10/18 全球购物
通信研究生自荐信
2014/02/01 职场文书
《狼》教学反思
2014/03/02 职场文书
给校长的建议书500字
2014/05/15 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
绿里奇迹观后感
2015/06/15 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python