解析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 相关文章推荐
解析Jquery的LigerUI如何实现文件上传
Jul 09 Javascript
js替换字符串的所有示例代码
Jul 23 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 Javascript
jQuery选择器及jquery案例详解(必看)
May 20 Javascript
Javascript之Number对象介绍
Jun 07 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
Nov 25 Javascript
JQuery ZTree使用方法详解
Jan 07 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
Aug 31 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
Apr 09 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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python日志模块logging简介
2015/04/13 Python
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python生成随机验证码的两种方法
2015/12/22 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
Java的for语句中break, continue和return的区别
2013/12/19 面试题
电厂职工自我鉴定
2014/02/20 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang