Javascript学习笔记 delete运算符_javascript技巧
程序员文章站
2022-04-25 09:32:27
...
一、语法
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赋值。
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赋值。
上一篇: jQuery support 源码解读
下一篇: php源代码加密
推荐阅读
-
Java 正则表达式学习总结和一些小例子_javascript技巧
-
javascript学习笔记(二十) 获得和设置元素的特性(属性)_基础知识
-
php基础学习笔记—javascript(5)
-
js数组操作学习总结_javascript技巧
-
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
-
JavaScript对象学习笔记
-
javascript中的void运算符语法及使用介绍_javascript技巧
-
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史_javascript技巧
-
JS的递增/递减运算符和带操作的赋值运算符的等价式_javascript技巧
-
JavaScript学习笔记:取数组中最大值和最小值_html/css_WEB-ITnose