delete 语法的本质深入解析

 更新时间:2023年03月02日 09:15:08   作者:云牧  
这篇文章主要为大家介绍了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: 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 语法解析的资料请关注脚本之家其它相关文章!

相关文章

  • 详解JS前端使用迭代器和生成器原理及示例

    详解JS前端使用迭代器和生成器原理及示例

    这篇文章主要为大家介绍了详解JS前端使用迭代器和生成器原理及示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JavaScript 对象详细整理总结

    JavaScript 对象详细整理总结

    这篇文章主要介绍了JavaScript 对象详细整理总结的相关资料,需要的朋友可以参考下
    2016-09-09
  • 微前端之 js隔离 样式隔离 元素隔离问题详解

    微前端之 js隔离 样式隔离 元素隔离问题详解

    这篇文章主要为大家介绍了微前端之 js隔离 样式隔离 元素隔离问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • JavaScript 原型与原型链详情

    JavaScript 原型与原型链详情

    这篇文章主要介绍了JavaScript 原型与原型链,JavaScript常被描述为一种基于原型的语言,对象以其原型为模板、从原型继承属性和放法。原型对象也可能拥有原型,并从中继承属性和方法,一层一层以此类推。这种关系常被称为原型链,带着简单的了解看看下文内容具体介绍吧
    2021-10-10
  • js封装一个websocket实现及使用详解

    js封装一个websocket实现及使用详解

    这篇文章主要为大家介绍了js封装一个websocket实现示例及使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Fabric.js 样式不更新解决方法案例

    Fabric.js 样式不更新解决方法案例

    这篇文章主要为大家介绍了Fabric.js 样式不更新解决方法案例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 微信小程序 详解下拉加载与上拉刷新实现方法

    微信小程序 详解下拉加载与上拉刷新实现方法

    这篇文章主要介绍了微信小程序 详解下拉加载与上拉刷新实现方法的相关资料,这里介绍了两种实现方法,需要的朋友可以参考下
    2017-01-01
  • 无UI 组件Headless框架逻辑原理用法示例详解

    无UI 组件Headless框架逻辑原理用法示例详解

    这篇文章主要为大家介绍了无UI 组件Headless框架逻辑原理用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 微信小程序 图片边框解决方法

    微信小程序 图片边框解决方法

    这篇文章主要介绍了微信小程序 图片边框解决方法的相关资料,需要的朋友可以参考下
    2017-01-01
  • 开发效率翻倍的Web API使用技巧

    开发效率翻倍的Web API使用技巧

    这篇文章主要为大家介绍了开发效率翻倍的Web API使用技巧详解,主要选取了一些有趣且有用的 Web API 进行介绍,并且 API 可以在线运行预览
    2023-05-05

最新评论