让学习“上瘾”,成为更好的自己!!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>delete操作符详解</title>
</head>
<body>
<script>
/*
1,代码类型
在ECMAScript中有3种类型的可执行代码:全局代码、函数代码和Eval代码
2,变量对象:全局对象(window对象) 和 激活对象(函数中的变量对象)
(1)当进入全局代码的执行上下文(执行环境)时,一个全局对象用作变量对象,在全局范围内声明变量或函数都会成为该变量对象的属性和方法
(2)在函数代码中,变量对象为激活对象。每次函数代码进入函数的作用域时,就会创建一个激活对象
函数代码中的变量、函数、形参、arguments对象都会成为该激活对象的属性或者方法
(3)在Eval代码中声明的变量作为正在调用的上下文的变量对象的属性被创建。Eval代码只是用他正在被调用的那个执行上下文的变量对象
3,属性特性 --> 记住,声明的变量或函数都会成为变量对象的属性或者方法
每个属性具有以下一个或多个特性:
(1)ReadOnly
(2)DontEnum
(3)DontDelete
(4)Internal
*/
// 4,delete操作符使用的具体情况有:【重要!!】
// (1) 声明的变量和函数带有DontDelete特性,未声明赋值变量和函数不具有DontDelete特性
// var a = 12;
// delete a; // false
// console.log(a);
// var b = function(){
// // y = 12323;
// // delete y; // true
// // console.log(y);
// var xx = 323232;
// delete xx; // false
// console.log(xx);
// }
// delete b; // false
// console.log(b);
// b();
// c = 12;
// delete c; // true
// console.log(c);
// d = function(){
// // do something
// }
// delete d; // true
// console.log(d);
// (2) 对象的内置属性(即对象的预定义属性)具有DontDelete特性,比如arguments, length
// function aa(){
// delete arguments; // false
// console.log(arguments);
// }
// aa();
// (3) 与函数参数相对应的创建的属性也具有DontDelete特性
// var bb = function(a, b){
// delete a; // false
// delete b;
// console.log(a);
// console.log(b);
// }(1, 2);
// (4) 明确或者隐含创建的属性不具有DontDelete特性
// var obj = {};
// obj.name = 'kai';
// console.log(obj.name);
// delete obj.name; // true
// console.log(obj.name);
// (5) DontDelete特性是在属性创建过程中确定的,后来的赋值不会修改现有属性已经存在的特性
// function foo(){
// }
// foo = 1;
// delete foo; // false
// console.log(foo);
// (6) Eval代码中创建的变量或者方法不具有DontDelete特性,而Eval代码中创建的方法中的变量或方法带有DontDelete特性
// eval('var x = 12;');
// console.log(x);
// delete x; // true
// console.log(x);
// eval('var x = 12;function aa(){var y = 1211;}');
// (7) C++ 的delete删除的是指针所指向的对象,而JavaScript中不会删除指针所指向的对象,而是删除其属性本身
// var o = {name:'kai'};
// o.x = new Object();
// delete o.x; // 上一行new的Object对象依然存在
// console.log(o.x); // undefined,o的名为x的属性被删除了
// delete o.x之后,Object对象会由于失去引用而被垃圾回收,所以delete o.x也就相当于“删除了o.x所指向的对象”,但这个动作并不是ECMAScript的标准
// (8) “删除属性而不是删除对象”
// var o = {};
// var a = {x:10};
// o.a = a;
// delete o.a; // o.a属性被删除
// console.log(o.a); // undefined
// console.log(a.x); // 10 --> 因为{x:10}对象依然被a引用,所以不会被回收
// (9) prototype中声明的属性也具有DontDelete特性
function C(){
this.x = 1;
}
C.prototype.x = 12;
C.prototype.y = 132;
var o = new C();
console.log(o.x); // 1 --> 构造函数本身定义的o.x
delete o.x; // false
console.log(o.x); // 12 --> prototype中定义的o.x, 即使在执行delete o.x也不会被删除
delete o.x; // false
console.log(o.x); // 12
delete C.prototype.x; // true
console.log(o.x); // undefined --> 原型也是一个对象,明确或者隐含创建的属性不具有DontDelete特性
delete o.y; // false
console.log(o.y); // 132
</script>
</body>
</html>