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 相关文章推荐
js option删除代码集合
Nov 12 Javascript
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
JavaScript时间转换处理函数
Apr 14 Javascript
JQuery Ajax WebService传递参数的简单实例
Nov 02 Javascript
原生JavaScript实现AJAX、JSONP
Feb 07 Javascript
教你用十行node.js代码读取docx的文本
Mar 08 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
Sep 06 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
vuex的使用步骤
Jan 06 Vue.js
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初学者头疼问题总结
2006/07/08 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
基于Python os模块常用命令介绍
2017/11/03 Python
Python元组常见操作示例
2019/02/19 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
python实现桌面托盘气泡提示
2019/07/29 Python
python opencv实现证件照换底功能
2019/08/19 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
童装店创业计划书
2014/01/09 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
机械操作工岗位职责
2014/08/08 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
师德培训心得体会2016
2016/01/09 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers