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 相关文章推荐
IE7提供XMLHttpRequest对象为兼容
Mar 08 Javascript
javascript 动态加载 css 方法总结
Jul 11 Javascript
jquery 打开窗口返回值实现代码
Mar 04 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
浅谈javascript语法和定时函数
May 03 Javascript
JS实现当前页居中分页效果的方法
Jun 18 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
Sep 01 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
layui表格分页 记录勾选的实例
Sep 02 Javascript
详解小程序云开发攻略(解决最棘手的问题)
Sep 30 Javascript
小程序中设置缓存过期的实现方法
Jan 14 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 Javascript
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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
PHP微信API接口类
2016/08/22 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
python实现数独算法实例
2015/06/09 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
Python import与from import使用及区别介绍
2018/09/06 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python 多线程中join()的作用
2020/10/29 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
业务员自荐信范文
2014/04/20 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
离职感谢信怎么写
2015/01/22 职场文书
HTML常用标签超详细整理
2022/03/19 HTML / CSS