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定义类或函数的几种方式小结
Jan 09 Javascript
js选项卡的实现方法
Feb 09 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
Feb 17 Javascript
JS获取随机数和时间转换的简单实例
Jul 10 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
Sep 16 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
Sep 06 jQuery
详解Vuex中mapState的具体用法
Sep 28 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
layer.confirm()右边按钮实现href的例子
Sep 27 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错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
JavaScript中的Window窗口对象
2008/01/16 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
Python进程间通信用法实例
2015/06/04 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
给医务人员表扬信
2014/01/12 职场文书
食品安全工作实施方案
2014/03/26 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
如何通过一篇文章了解Python中的生成器
2022/04/02 Python