JavaScript中诡异的delete操作符


Posted in Javascript onMarch 12, 2015

delete这个操作符呢,在javascript中不是很常用,但是他的特性的确很诡异。

1,删除对象的属性,代码:

var o = {

    a: 1,

    b: 2   

};

delete o.a;

alert(o.a);  //undefined

那么到底delete删除的是对象的属性还是对象的属性值呢,我开始觉得删除的应该是值,因为结果是undefined,而没有报错。但是事实上,我的看法是错误的,举例说明:

var o = {};

var a = {

    pro: "zhenn"

};

o.c = a;

delete o.c;    //删除对象o的属性a

console.log(o.c);     // undefined

console.log(a.pro);   // zhenn

通过上述代码,不难看出在delete o.c之后呢,并没有删除o.c所指向的值,也就是对象a依然存在,否则a.pro应该是过不了编译这关的。说到这里,可以这么理解delete删除对象 的属性,其实相当于删除了对对象中属性值的引用而已,但是这个值依然在对象栈中!

2,对数组的操作,先看代码:

var arr = [1,2,3];

delete arr[2];

console.log(arr.length);  // 3

console.log(arr);   // [1,2,undefined]

又一次证明了,delete并没有真正删除元素,只是删除了元素所对应的键值。为了更进一步认清delete的本质,和Array中的pop方法比较一下。如下:

var arr = [1,2,3];

arr.pop();

console.log(arr);  // [1,2]

console.log(arr.length)  // 2

这下应该真相大白了。

3,以上对对象和数组的操作,还很好理解,但是对于变量的操作,难免让人琢磨不透,代码如下:

var a = 1;

delete a;

alert(a); // 1

 

function fn(){ return 42; }

delete fn;

alert(fn());  // 42

 

b = 2;

delete b;

alert(b);  // b is not defined;

很难解释通啊,同样是全局变量,用var声明的竟然删除不了,而直接声明的变量b竟然可以删除,不能不说delete很诡异了,在ECMA给出的解释中,也仅仅是说通过var声明的变量和通过function声明的函数拥有DontDelete特性,无法被删除。

Javascript 相关文章推荐
jQuery的初始化与对象构建之浅析
Apr 12 Javascript
JavaScript中的继承方式详解
Feb 11 Javascript
jQuery简单实现隐藏以及显示特效
Feb 26 Javascript
asp.net+js实现金额格式化
Feb 27 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
浅谈Cookie的生命周期问题
Aug 02 Javascript
JS实现的四级密码强度检测功能示例
May 11 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
vue项目中公用footer组件底部位置的适配问题
May 10 Javascript
基于JavaScript实现瀑布流布局
Aug 15 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
Sep 04 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
Mar 12 #Javascript
jquery实现页面关键词高亮显示的方法
Mar 12 #Javascript
JavaScript设计模式学习之“类式继承”
Mar 12 #Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 #Javascript
JavaScript中return false的用法
Mar 12 #Javascript
JavaScript中神奇的call()方法
Mar 12 #Javascript
jquery实现无限分级横向导航菜单的方法
Mar 12 #Javascript
You might like
PHP类中Static方法效率测试代码
2010/10/17 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
React组件生命周期详解
2017/07/03 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
p5.js实现简单货车运动动画
2019/10/23 Javascript
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
tensorflow之并行读入数据详解
2020/02/05 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
详解python算法常用技巧与内置库
2020/10/17 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
网上卖盒饭创业计划书范文
2014/02/07 职场文书
小学生综合素质评语
2014/04/23 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
2015年人事科工作总结
2015/04/28 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
Opencv中cv2.floodFill算法的使用
2021/06/18 Python
SQL Server实现分页方法介绍
2022/03/16 SQL Server
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸