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 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
javascript document.execCommand() 常用解析
Dec 14 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
Jul 11 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
Apr 15 Javascript
很不错的两款Bootstrap Icon图标选择组件
Jan 28 Javascript
AngularJS入门教程中SQL实例详解
Jul 27 Javascript
轻松掌握JavaScript享元模式
Aug 27 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 Javascript
vue实现简单瀑布流布局
May 28 Javascript
多个Vue项目部署到服务器的步骤记录
Oct 22 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
PHP4实际应用经验篇(1)
2006/10/09 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
CCPry JS类库 代码
2009/10/30 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
python继承和抽象类的实现方法
2015/01/14 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
详解Python中where()函数的用法
2018/03/27 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
如何理解python对象
2020/06/21 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
企业领导对照检查材料
2014/08/20 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技