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 相关文章推荐
javascript继承之为什么要继承
Nov 10 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
详解vue.js组件化开发实践
Dec 14 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
vue.js实现含搜索的多种复选框(附源码)
Mar 23 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
Aug 09 jQuery
对vue事件的延迟执行实例讲解
Aug 28 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
May 10 Javascript
Vue + ts实现轮播插件的示例
Nov 10 Javascript
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
Javascript之datagrid查询详解
Sep 15 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设计模式中的工厂模式
2008/06/12 PHP
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php微信支付之APP支付方法
2015/03/04 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
Python3.2中的字符串函数学习总结
2015/04/23 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
电气工程师岗位职责
2014/01/01 职场文书
节能减耗标语
2014/06/21 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
比赛主持人开场白
2015/05/29 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python