开发十年,就只剩下这套架构体系了! >>>   

概念
再mdn中detele的概念如下。
delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放。
对于文字的理解我们有时有点不解其意,直接上代码更适合我们的style.
eg:

var parsent = {
    son: 'jim',
    children:['jim', 'bob']
}
console.log(parsent.son,'删除前')
delete parsent.son
// 清空parsent先注释
//for (let key in parsent) {
//    delete parsent[key]
//}
console.log(parsent.son,'删除后')
结果如下图所示


删除了parsent的son属性,再对象里没有了,parsent.son==undefined,对象里只有children属性了,
下面我们来看看delete是否可以清除对象里的数组和子对象,看下面例子。
eg:

var parsent = {
        son: 'jim',
        obj: {son: 'jim', other: 'bob'},
        children:['jim', 'bob']
    }
console.log(parsent,'删除前')
// 清空parsent
for (let key in parsent) {
    delete parsent[key]
}
console.log(parsent,'删除后')
如下图我们可以很清晰的看到把parsent对象的属性给清空了,将其变成了{}

上面delete操作的是对象的属性,是不是可以直接将对象给delete之后就将其清空了呢?带着这个疑问运行下下面的代码
eg:

var parsent = {
        son: 'jim',
        obj: {son: 'jim', other: 'bob'},
        children:['jim', 'bob']
    }
console.log(parsent,'删除前')
// 清空parsent
delete parsent
console.log(parsent,'删除后')
打开Chrome浏览器按下F12到控制台复制这段代码,按下enter键返回如下结果

显示的是parsent对象没有被删除掉。
因此delete的语法应该如下:
delete object.property
delete object[‘property’]
删除的是某个属性的引用,object对象的名称,property属性的名称。
操作返回的结果都是true,即:对于所有情况都是true,除非属性是一个自己不可配置的属性,在这种情况下,非严格模式返回 false。
以下是应该注意的情况
1、如果你试图删除的属性不存在,那么delete将不会起任何作用,但仍会返回true
2、如果对象的原型链上有一个与待删除属性同名的属性,那么删除属性之后,对象会使用原型链上的那个属性(也就是说,delete操作只会在自身的属性上起作用)
3、任何使用 var 声明的属性不能从全局作用域或函数的作用域中删除。
3.5、这样的话,delete操作不能删除任何在全局作用域中的函数(无论这个函数是来自于函数声明或函数表达式)
除了在全局作用域中的函数不能被删除,在对象(object)中的函数是能够用delete操作删除的。
4、任何用let或const声明的属性不能够从它被声明的作用域中删除。
不可设置的(Non-configurable)属性不能被移除。这意味着像Math, Array, Object内置对象的属性以及使用Object.defineProperty()方法设置为不可设置的属性不能被删除。
5、delete可以删除数组但是数组的长度不会改变,想要删除数组可以使用splice
下面实例是在defineProperty设置为不可设置情况下delete parsent.name会返回false,如果=={configurable: false}==的值为true的话,delete parsent.name会返回true
eg:

var parsent = {
        son: 'jim',
        obj: {son: 'jim', other: 'bob'},
        children:['jim', 'bob']
    }
console.log(parsent,'删除前')
Object.defineProperty(parsent,'name',{configurable: false})
console.log(delete parsent.name) // 返回的是false
// 清空parsent
//for (let key in parsent) {
//    console.log(delete parsent[key])
//}
console.log(parsent,'删除后')

下面是比较全面的对应上面所说的注意点,源码如下:
eg:

var parsent = {
        son: 'jim',
        obj: {son: 'jim', other: 'bob'},
        children:['jim', 'bob'],
        objFn: function(){}
    }

console.log(parsent,'删除前')
Object.defineProperty(parsent,'name',{configurable: false})
//console.log(delete parsent.name)
//清空parsent
console.log(1, delete parsent.far) // return true对应第1点
function Class(){
    this.son=123
}
Class.prototype.son = 456
var example = new Class()
console.log(example.son,'前')
console.log(2, delete example.son)//return false对应第2点
console.log(example.son, '后')//删除对象的自己属性,对象使用原型链上的属性
var aa='wang'
console.log(3, delete aa)
function fn(){};
console.log(3.5,'对象外的fn' , delete fn, ' 对象内的objFn', delete parsent.objFn)
let bb=3;const cc=4;
console.log(4, delete bb, delete cc)// 都是返回false对应第四点
console.log(5, delete parsent.name)//return false对应第2点
console.log(parsent,'删除后')
得到的结果如下图

以上就是delete操作符的小秘密,很高兴与大家一起分享。

关于js中delete 操作符的秘密(如何删除对象的属性,清空对象)相关推荐

  1. js中new操作符的作用及原理

    要知道new操作符的作用是什么,得先知道它干了什么事(原理): 它创建了一个新对象 它将构造函数的原型属性和方法挂载到新对象的__proto__(原型指针)上 他执行了构造函数并将构造函数的this指 ...

  2. js中数据结构数组Array、映射Map、集合Set、对象、JSON

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...

  3. 对象、对象的属性、对象字面量、枚举对象中的属性、可变类型、变量和对象——JS对象

    目录 一.对象 二.对象的属性 三.对象字面量 四.枚举对象中的属性 五.可变类型 六.变量和对象 数据类型: 原始值:(不可变类型) 1.数值 Number 2.大整数 BigInt 3.字符串 S ...

  4. Three.js中实现点击按钮添加删除旋转立方体

    场景 Three.js中引入dat.gui库实现界面组件控制动画速度变量: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1193 ...

  5. JS中new操作符做了什么?

    1.new操作符做了什么 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例.new 关键字会进行如下的操作: 创建一个空的简单JavaScript对象(即{}): 链接该对 ...

  6. js中delete是es6_js和es6中的字符串方法总结

    1.substring(start,end) -> 截取字符串 用法: 1.substring(start,end) -> 用数学表达式表达区间的话就是截取[start,end); 2.s ...

  7. js中new操作符具体做了什么

    创建了一个空的对象 将空对象的原型,指向于构造函数的原型 将空对象作为构造函数的上下文(改变this指向) 对构造函数有返回值的处理判断 function Fun( age,name ){this.a ...

  8. mysql中delete from in子查询删除失败

    遇到一个情况,想通过表1的id找到表2,删除表2中barcode关联的库存数据,然后一直不能失败,如下: delete from 库存表 where BARCODE in ( select BARCO ...

  9. js 对象数组中的已知对象的属性得到对象下标

    arr 对象数组, wyw已知属性 多用于接口返回数据后根据已知属性查其他属性 var arr = new Array({"name": "wxx", &quo ...

最新文章

  1. 您有一份意外的福利待领取!
  2. 简述在虚拟机中安装 centos 的过程_从零构建Fabric开发运行环境手册(一):安装OS虚拟机(CentOS)...
  3. jsp连接mysql数据库 例子_JSP 连接 MySQL 数据库的例子
  4. bisect git 使用_让 Git Bisect 帮助你
  5. C++primer第九章 顺序容器 9.1 顺序容器概述 9.2容器库概览
  6. 一张图片解决 Python 所有内置异常
  7. Java基础学习总结(77)——Java枚举再总结
  8. schedule()函数的调用时机(周期性调度)
  9. sqlplus中设置在屏幕中上不打印出输出
  10. 47. Magneto Transaction Email(1)
  11. 极客大学架构师训练营--食堂就餐系统架构设计⽂档 -- 第一次作业
  12. C/C++编程工具及实用小软件推荐
  13. 今天给大家分享下收集的一些文案:日常文案系列合集,收藏备用
  14. Pycharm 编辑器文本中间出现有一条分割线
  15. 虚幻4连接mysql蓝图教程_ue4商城资源MySQL Integration数据库集成插件
  16. devstack only neutron keyston
  17. 显示器接口:VGA、HDMI、DVI 、DisplayPort
  18. C语言 内存管理的细枝末节
  19. MotoSim EG-VRC软件:机器人系统创建与模型布局操作
  20. 【NLP】用ML实现中文短文本分类(二分类)

热门文章

  1. php sequelize,egg.js整合数据库ORM框架Sequelize
  2. 初学算法——第二天:斐波那契数列
  3. cython,加速python,保护代码(3):扩展文件 .pxd
  4. JADE学习笔记4:Agent通信
  5. python3 pyQt5之listWidget控件的高级运用--将多种控件组合插入其中一行
  6. e讯丨美国政府问责局(GAO)发布网安审计报告 提出美应对网安挑战的十条行动
  7. onchange()事件的应用
  8. 如何整理撰写舆情信息报告的方法技巧
  9. 蒙版操作—图层混合颜色换天空背景
  10. python最大连续递增子列_最长递增子序列(LIS)解法详述