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 showModelDialog的使用方法示例详解
Nov 19 Javascript
jquery实现类似淘宝星星评分功能实例
Sep 12 Javascript
js模拟淘宝网的多级选择菜单实现方法
Aug 18 Javascript
JS实现刷新父页面不弹出提示框的方法
Jun 22 Javascript
AngularJS监听路由的变化示例代码
Sep 23 Javascript
JavaScript实现垂直向上无缝滚动特效代码
Nov 23 Javascript
基于JavaScript实现选项卡效果
Jul 21 Javascript
Vue+webpack项目基础配置教程
Feb 12 Javascript
解决vue多个路由共用一个页面的问题
Mar 12 Javascript
js实现弹幕飞机效果
Aug 27 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
11个Javascript小技巧帮你提升代码质量(小结)
Dec 28 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 函数执行效率的小比较
2010/10/17 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
餐厅销售主管职责范本
2014/02/19 职场文书
社区先进事迹材料
2014/05/19 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
个人催款函范文
2015/06/24 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
Golang 并发编程 SingleFlight模式
2022/04/26 Golang
Nginx如何配置根据路径转发详解
2022/07/23 Servers