解析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 - 如何引入js代码
Mar 09 Javascript
网页里控制图片大小的相关代码
Jun 25 Javascript
extjs 学习笔记 四 带分页的grid
Oct 20 Javascript
input的focus方法使用
Mar 13 Javascript
利用javascript的面向对象的特性实现限制试用期
Aug 04 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
Mar 21 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
JavaScript制作淘宝星级评分效果的思路
Jun 23 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
vuejs选中当前样式active的实例
Aug 22 Javascript
jQuery带控制按钮轮播图插件
Jul 31 jQuery
js重写alert事件(避免alert弹框标题出现网址)
Dec 04 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
js 文件引入实现代码
2010/04/23 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
Python Deque 模块使用详解
2014/07/04 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
带你了解python装饰器
2017/06/15 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
Python如何安装第三方模块
2020/05/28 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android
PHP RabbitMQ消息列队
2022/05/11 PHP
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS