delete 语法的本质深入解析

2023-03-02 16:05:31
目录
delete 的返回值delete 不能删除哪些属性delete 删除原型上的属性delete 删除的到底是什么严格模式删除报错

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:>:TypeError典型的 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 语法解析的资料请关注易采站长站其它相关文章!