首頁 > 軟體

delete 語法的本質深入解析

2023-03-02 18:01:06

delete 的返回值

delete 語法是用於 JS 刪除物件屬性和陣列元素

返回 boolean 型別

true 代表刪除沒有發生異常,但不一定是刪除成功

false 一定是刪除失敗

var obj = {
  a: 1,
  b: 2
};
// 刪除物件屬性
console.log(delete obj.a); // true
// 刪除物件不存在的屬性
console.log(delete obj.name); // true
// 刪除全域性物件 obj ,因為 var 宣告預設會掛載到全域性 window 物件上
console.log(delete obj); // false
console.log(obj); // { b: 2 }

delete 不能刪除哪些屬性

  • 任何用 var 宣告的屬性,不能從全域性或函數作用域刪除
  • 任何用 let 或者 const 宣告的屬性 ,不能從它宣告的作用域刪除
  • 不可設定(configurable: false)的屬性不能刪除
// var
function testVar() {
  var a = 1;
  console.log(delete a); // false
  console.log(a); // 1
}
testVar();
// let const
function testLet() {
  let a = 2;
  console.log(delete a); // false
  console.log(a); // 2
}
testLet();
// configurable
const obj = {};
Object.defineProperty(obj, "name", { configurable: false });
console.log(delete obj.name); // false
console.log("delete undefined", delete undefined);
console.log(Object.getOwnPropertyDescriptor(global, "undefined"));
console.log("delete Infinity", delete Infinity);
console.log("delete NaN", delete NaN);

delete 刪除原型上的屬性

  • 不會遍歷原型鏈刪除
function User() {
  this.name = "雲牧";
}
User.prototype.name = "黛玉";
const p = new User();
// 刪除的是 p 物件的自身屬性
console.log(delete p.name); // true
// p.name 依然可用,因為原型鏈可以查詢到 name
console.log(p.name); // 黛玉
// 刪除原型上的屬性
console.log(delete User.prototype.name); // true
// 範例和原型上都沒有 name
console.log(p.name); // undefined

delete 刪除的到底是什麼

  • 刪除的是操作表示式結果
  • 對於值,字面量或不可達的參照,不操作,直接返回 true
  • 參照型別,刪除參照
var nameVar = "nameVar";
nameNotVar = "nameNotVar";
// var 宣告的不可以刪除
console.log(Object.getOwnPropertyDescriptor(window, "nameVar")); // configurable: false
// 非 var 宣告的可以刪除
console.log(Object.getOwnPropertyDescriptor(window, "nameNotVar")); // configurable: true

嚴格模式刪除報錯

  • 對於 變數,函數名,函數引數SyntaxError
  • 對於 configurable: falseTypeError
  • 典型的 delete super.property :ReferenceError

下面是錯誤的例子:

"use strict";
// 變數
var name = "name";
delete name;
// 函數和函數引數
function fn() {}
delete fn;
function fn(name) {
  delete name;
}
fm();
// configurableTypeError
const person = {
  name: "帥哥"
};
Object.defineProperty(person, "name", {
  configurable: false
});
delete person.name;
// 嚴格 refer
class Parent {
  constructor(name) {
    this.name = name;
  }
  getName() {}
}
class Child extends Parent {
  constructor(name, age) {
    super(name);
    this.age = age;
  }
  deleteAny() {
    delete super.getName;
  }
}
var child = new Child("child", 18);
child.deleteAny();

以上就是delete 語法的本質深入解析的詳細內容,更多關於delete 語法解析的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com