javascript中理解delete操作符

我们常常会在js中定义一些变量,方法,对象等等,当我们不在或是不想再使用这变量或是需要剔除它的时候,我们就可以使用delete操作符来达到移除的目的,但是,在使用delete也是有许多注意的地方:

var Employee = {
firstname: "Mohammed",
lastname: "Haddad"
}

console.log(Employee.firstname);
// expected output: "Mohammed"

delete Employee.firstname;

console.log(Employee.firstname);
// expected output: undefined

上述代码定义了一个Employee对象,对象里面有firstname跟lastname属性,当执行delete Employee.firstname这条语句后,我们再次输出Employee.firstname可以看出结果为undefined,这说明该对象下的这个属性已经被删除掉了

delete 操作符始终会返回一个布尔值,成功返回true,反之为false

需要注意的是,delete与释放内存是没有关系的,所谓的释放内存是通过断开变量间的引用来达到垃圾回收机制自动回收内存的。

  • 当delete一个不存在的属性或变量,将会返回true
  • 当原型链中存在相同的属性时,将会删除掉自身的属性
  • 使用var定义的变量不可使用delete删除,全局可以使用delete删除
  • 通过let,const es2015这种方式定义的变量也是不可删除的
  • js内置的对象属性不可删除
var Employee = {
  age: 28,
  name: 'abc',
  designation: 'developer'
}
console.log(delete Employee.name);   // returns true
console.log(delete Employee.age);    // returns true
// 当我们试着删除一个不存在的属性时,总是返回true
console.log(delete Employee.salary); // returns true

当定义对象通过defineProperty来定义的属性时,可以控制是否可以删除

var Employee = {};
Object.defineProperty(Employee, 'name', {configurable: false});
console.log(delete Employee.name);  // returns false
//解释为何通过var定义的变量不能被删除
var b = 1;
Object.getOwnPropertyDescriptor(window,'b')//我们通过getOwnPropertyDescriptor会发现configurable: false,故而不能被删除
//{value: 1, writable: true, enumerable: true, configurable: false}
delete b
//false
x=3
Object.getOwnPropertyDescriptor(window,'x')//当没有使用var来定义变量时,我们发现configurable: true,故而是可以删除的
//{value: 3, writable: true, enumerable: true, configurable: true}
delete x
//true
在严格模式下,删除不存在的变量,删除不能删除的变量,内部属性等都会报错的
'use strict';
delete xx
//Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
'use strict';
var a = 11;
delete a
//Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
'use strict';
delete Math.PI
//Uncaught TypeError: Cannot delete property 'PI' of #<Object>
原型链上的属性,若是自定义的,可以通过delete删除,若是系统自带的是不能删除的,delete obj.toString()//return true虽然返回true,但实际上是删除不成功的,在严格模式下回报错
若该对象与原型链上具有相同名字的属性时,通过delete删除对象上的属性时,再去调用该属性时,将会从原型链上去找这属性
function Foo() {
  this.bar = 10;
}
Foo.prototype.bar = 42;
var foo = new Foo();
//将会返回true,删除掉的是foo自身上的属性bar
delete foo.bar;
// foo.bar 任然是可以使用的,但是这个foo.bar是找到的Foo.prototype原型链上的bar
console.log(foo.bar);
// 我们再删掉Foo原型上的bar
delete Foo.prototype.bar; 
// 删除掉原型上的bar后,由于自身及原型链上已经没有了bar这个属性,故而输出undefined
console.log(foo.bar);
函数内部的变量:
function foo(){}
 /* 对foo重新赋值 */
foo = 1;
delete foo; // false
typeof foo; // "number" 
/* 但是一个内部不存在的属性时,却是可以删除的 */
this.bar = 1; 
delete bar; // true 
typeof bar; // "undefined"
在使用eval时会出现不同
eval('var n = 2;')
n // 2
Object.getOwnPropertyDescriptor(window,'n') // {value: 2, writable: true, enumerable: true, configurable: true}
delete n // true
typeof n // "undefined"
这种浏览器间的差异请查看更多
删除数组元素:
var arr = [1,2,3,4,5]
arr
> [1, 2, 3, 4, 5]
arr.length
> 5
0 in arr
>true
delete arr[0]
>true
arr
> [empty, 2, 3, 4, 5] 
arr.length
> 5
0 in arr
> false
//我们可以看到通过delete成功删除数组元素,当前位变空位,但是数组的长度还是不变的
//通过in操作符可以看出明确是删除成功了。
for(var a of arr){
 console.log(a)
}
undefined
2
3
4
5
//由此可以看出即便是删除成功了,但是通过for...of遍历的时候还是会把删除位以undefined关键字的形式输出
所以我们进行数组删除的时候最好不要使用delete,可以使用splice方法来删除数组元素



PHP Warning: curl_exec() has been disabled for security reasons in /home/ftp/f/free49568/wwwroot/wp-content/themes/Variant/functions.php on line 490 百度已收录
分享