解析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 面向对象的 私有成员和公开成员
May 13 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
Oct 18 Javascript
ExtJS4中的requires使用方法示例介绍
Dec 03 Javascript
Javascript写入txt和读取txt文件示例
Feb 12 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
深入理解js中的加载事件
Feb 08 Javascript
ES6之模版字符串的具体使用
May 17 Javascript
Node.js npm命令运行node.js脚本的方法
Oct 10 Javascript
Layui 动态禁止select下拉的例子
Sep 03 Javascript
layui table单元格事件修改值的方法
Sep 24 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 Javascript
微信小程序实现下拉加载更多商品
Dec 29 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP的几个常用加密函数
2016/02/03 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
Javascript实现单例模式
2016/01/24 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
Python实现线程状态监测简单示例
2018/03/28 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python和Bash结合在一起的方法
2020/11/13 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
白酒市场开发计划书
2014/01/09 职场文书
家长给学校的建议书
2014/05/15 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
赞美教师的句子
2019/09/02 职场文书
Golang 遍历二叉树
2022/04/19 Golang