Javascript学习笔记 delete运算符


Posted in Javascript onSeptember 13, 2011

一、语法

delete后面的表达式必须给出一个属性的引用,比如
var o = {a:1};
delete o.a; //此处o.a是对象o的属性a的引用

只有在with语句里才能使用单独的属性名

with(o){ 
delete a; 
}

二、delete的返回值

delete是普通运算符,会返回true或false。规则为:当被delete的对象的属性存在并且不能被删除时 返回false,否则返回true。 这里的一个特点就是,对象属性不存在时也返回true,所以返回值并非完全等同于删除成功与否。

var o = {a:1}; 
delete o.a; //返回true 
var b = 2; 
delete b;//返回false,ECMA规则约定:使用var和function声明的变量不可以被delete

三、哪些情况下不允许delete

上例提到的var和function声明的变量不可以被delete,但隐式声明可以被删除
function c(){return 12;} 
delete c;//返回false 
d = function(){return 12;} 
delete d;//返回true

不能delete从原型链上继承的属性,但可以删除原型链上的属性
function Foo(){} 
Foo.prototype.bar = 42; 
var foo = new Foo(); 
delete foo.bar; // 返回true,但并没有起作用 
alert(foo.bar); // alerts 42, 属性是继承的 
delete Foo.prototype.bar; // 在原型上删除属性bar 
alert(foo.bar); // alerts "undefined", 属性已经不存在,无法被继承

四、特例
eval执行的代码中如有通过var和function声明的变量,可以被delete 
eval("var a=1"); 
delete a; 
alert(a); //报未定义错误

如果声明是在eval执行代码中的闭包内进行的,则变量不能被delete
eval("(function(){var a=1;delete a; return a;})()");//1
五、delete 数组元素 从数组中delete其元素并不会影响数组的长度
var arr = ['yuyin','suhuan','baby']; 
delete arr[0]; 
alert(arr.length);//alert 3

被delete的键值已经不属于数组,但却还是可以被访问,其值为undefined。
var arr = ['yuyin','suhuan','baby']; 
delete arr[0]; 
0 in arr; // false 
alert(arr[0]);//undefined 
arr[0] === undefined;//true

对比直接将键值赋值undefined
var arr = ['yuyin','suhuan','baby']; 
arr[0] = undefined; 
0 in arr; // true 
alert(arr[0]);//undefined 
arr[0] === undefined;//true

可以看出delete 操作只是将键值这个属性从数组中删除了,数组本身也是对象,这个情况好理解的。如果需要保留键值,可以用undefined赋值。
Javascript 相关文章推荐
JavaScript 提升运行速度之循环篇 译文
Aug 15 Javascript
location.href语句与火狐不兼容的问题
Jul 04 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
javaScript实现可缩放的显示区效果代码
Oct 26 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
js中数组的常用方法小结
Dec 30 Javascript
基于JavaScript实现自定义滚动条
Jan 25 Javascript
微信小程序联网请求的轮播图
Jul 07 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
JSON字符串操作移除空串更改key/value的介绍
Jan 05 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
Webkit的跨域安全问题说明
Sep 13 #Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
Sep 13 #Javascript
容易被忽略的JS脚本特性
Sep 13 #Javascript
Javascript学习笔记-详解in运算符
Sep 13 #Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
Sep 13 #Javascript
ie下动态加态js文件的方法
Sep 13 #Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 #Javascript
You might like
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
python批量替换多文件字符串问题详解
2018/04/22 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
非常详细的C#面试题集
2016/07/13 面试题
竞选学生会演讲稿
2014/04/25 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
个人授权委托书范本
2014/09/14 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技