解析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 相关文章推荐
鼠标经过的文本框textbox变色
May 21 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
Apr 15 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
Jun 05 Javascript
JQuery实现图片轮播效果
Sep 15 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
Iview Table组件中各种组件扩展的使用
Oct 20 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
Aug 26 Javascript
js实现表单项的全选、反选及删除操作示例
Jun 05 Javascript
vue 监听 Treeselect 选择项的改变操作
Aug 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
PHP也能干大事 随机函数
2015/04/14 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
php多进程应用场景实例详解
2019/07/22 PHP
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
Python通过解析网页实现看报程序的方法
2014/08/04 Python
Python中实现的RC4算法
2015/02/14 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
Python中return self的用法详解
2018/07/27 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
Python 中如何写注释
2020/08/28 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
python制作抽奖程序代码详解
2021/01/15 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
C#笔试题集合
2013/06/21 面试题
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
自荐书范文范例
2014/02/13 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
老公爱的承诺书
2014/03/31 职场文书
班级学习计划书
2014/04/27 职场文书
预防煤气中毒方案
2014/06/16 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
图文详解nginx日志切割的实现
2022/01/18 Servers
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js