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 相关文章推荐
用倒置滤镜把div倒置,再把table倒置。
Jul 31 Javascript
javascript定时器完整实例
Feb 10 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
JS留言功能的简单实现案例(推荐)
Jun 23 Javascript
jQuery焦点图轮播效果实现方法
Dec 19 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
Dec 11 Javascript
webpack4的迁移的使用方法
May 25 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 28 Javascript
webpack4从0搭建组件库的实现
Nov 29 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
Win下如何安装PHP的APC拓展
2013/08/07 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
浅谈JavaScript中指针和地址
2015/07/26 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
Python中的自省(反射)详解
2015/06/02 Python
linux安装python修改默认python版本方法
2019/03/31 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
python 实现矩阵填充0的例子
2019/11/29 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
基于keras中的回调函数用法说明
2020/06/17 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
新学期红领巾广播稿
2014/01/14 职场文书
学生周末长期请假条
2014/02/15 职场文书
岳庙导游词
2015/02/04 职场文书
感恩教育主题班会
2015/08/12 职场文书
学习委员竞选稿
2015/11/20 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书