Javascript学习笔记 delete运算符

 更新时间:2011年09月13日 22:21:00   作者:  
关于javascript的delete运算符,MDN里有相关文档。以下是我的学习笔记,更多是要关注特殊情况的使用和注意点。
一、语法

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实现自定义标签

    用javascript实现自定义标签...
    2007-05-05
  • Bootstrap零基础入门教程(二)

    Bootstrap零基础入门教程(二)

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。这篇文章主要介绍了Bootstrap零基础入门教程(二) 的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • 浅谈async、defer以普通script加载的区别

    浅谈async、defer以普通script加载的区别

    本文主要介绍了浅谈async、defer以普通script加载的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 微信小程序使用image组件显示图片的方法【附源码下载】

    微信小程序使用image组件显示图片的方法【附源码下载】

    这篇文章主要介绍了微信小程序使用image组件显示图片的方法,结合实例形式简单分析了微信小程序附image组件的相关使用技巧,并附带源码供读者下载参考,需要的朋友可以参考下
    2017-12-12
  • webpack中的代理配置详解

    webpack中的代理配置详解

    本文主要介绍了webpack中的代理配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • JavaScript基于querySelector / querySelectorAll对元素的操作(DOM API扫盲)

    JavaScript基于querySelector / querySelectorAll对元素的操作(DOM AP

    这篇文章主要介绍了JavaScript基于querySelector / querySelectorAll对元素的操作(DOM API扫盲),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • 微信小程序组件化开发的示例介绍

    微信小程序组件化开发的示例介绍

    虽然小程序在刚推出时是不支持组件化的,但如今小程序开始支持自定义组件开发,下面这篇文章主要给大家介绍了关于微信小程序组件化开发的相关资料,需要的朋友可以参考下
    2023-03-03
  • JavaScript中数组常见操作技巧

    JavaScript中数组常见操作技巧

    下面介绍JavaScript中的数组对象遍历、读写、排序等操作以及与数组相关的字符串处理操作,需要的的朋友参考下吧
    2017-09-09
  • 仅IE支持clearAttributes/mergeAttributes方法使用介绍

    仅IE支持clearAttributes/mergeAttributes方法使用介绍

    仅IE中HTMLElement元素具有clearAttributes/mergeAttributes方法,它们都是非标准的
    2012-05-05
  • 多个js与css文件的合并方法详细说明

    多个js与css文件的合并方法详细说明

    在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一些问题;解决该问题的一个好的方法就是合并js,css文件需要了解的朋友可以参考下
    2012-12-12

最新评论