你知道 delete 删除属性时的一些细节吗?

探究 delete 的一些细节,起源于刚刚做过的一道笔试,原题如下:

a = 1;
const b = 2;
console.log(delete a);
console.log(delete b); 
// 输出结果是?
// 答:true false

我可从来没用过 delete 的返回值,但凡犹豫一秒都是对自己的不自信,所以立马选择 undefined,笔试结束后回想起来,怎么会出这么奇怪的题,于是自己实际试了一下,真是不试不知道,一试吓一跳啊!!!

2023-09-21-21-32-59

delete 关键字是其实有返回值的!并且 delete 还是有一些细节/规则的

  • 如果删除的属性不存在于对象本身,delete 不起任何作用,但仍会返回 true !

  • delete 只会删除对象自身属性,不会删除对象原型链上的属性!

    function A() {}
    A.prototype.b = 1;
    const a = new A();
    console.log(delete a.b, a.b); // true 1 (删除对象自身不存在属性时返回true,并且无法删除原型链上的属性)
    
  • 不可配置的属性不能被删除,返回 false !

  • 无法直接删除有声明的变量(包括函数参数),返回 false !

    delete variable 在严格模式下抛出 SyntaxError 错误

    • 任何使用 var 声明的属性不能从全局作用域或函数的作用域中删除,因为即使它们可能附加到全局对象上,它们也是不可配置的。
    • 任何使用 let 或 const 声明的属性不能够从它被声明的作用域中删除,因为它们没有附加到任何对象上。

现在看来同程旅行还是保守了,要是现在的我,我估计会出下面的题:

a = 1; // 绑定到了 globalThis 对象中
var b = 2; // 绑定到了 globalThis 对象中
const obj = {};
const d = 3;
let e = 4;
console.log(Object.getOwnPropertyDescriptor(globalThis, 'a').configurable); // true
console.log(Object.getOwnPropertyDescriptor(globalThis, 'b').configurable); // false(通过var定义的全局变量虽然会被绑定到globalThis中,但它是不可配置的!)console.log(delete a); // true (a不是一个有声明的变量,这时会去globalThis上找,把globalThis.a给删了)
console.log(delete b, b); // false 2 (下面单独说)
console.log(delete obj, obj); // false {} (对象 obj 没有被删,因为 obj 是 const 声明)
console.log(delete obj.c, obj.c); // true undefined (删除一个原本就不存在的属性返回 true )
console.log(delete d, d); // false 3 (变量 d 没有被删,因为它是 const 声明)
console.log(delete e, e); // false 4 (变量 e 没有被删,因为它是 let 声明)
console.log(delete f); // true(删除一个原本就不存在的属性返回 true )

globalThis 就是全局对象,浏览器下指向 window、node下指向 global。

console.log(delete b, b);没有把 b 删除,我们有两种解释:

  1. 跟 const、let 声明一样,var 声明的变量无法直接被删除。
  2. b 没被删除是因为,当 delete 去 globalThis 上找它时,发现它是不可配置的,所以无法删除。

为了简单理解和减少歧义,我更认同 1 的解释(你可以想一下 2 的解释会引发哪些歧义),如果您有更好的理解,欢迎评论区留言!

var 声明的全局变量是不可配置的这个细节在“谈谈 var、const、let 的区别”的这个面试题中可以主动展开说一下🧐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言大佬的必杀技---宏的高级用法

C语言大佬的必杀技—宏的高级用法 目录: 字符串化标记的拼接宏的嵌套替换多条语句防止一个文件被重复包含宏和函数的区别 可能大家在学习的时候用得比较少,但是在一些代码量比较大的时候,这样使用,可以大大的提高代码的可读性,…

Unity中Shader中UI材质去色功能实现

文章目录 前言一、实现思路1、在属性面板暴露一个 开关 来控制去色变体2、声明一个变体3、在片元着色器实现去色 二、实现1、定义开关2、声明变体3、在片元着色器中,使用宏判断是否去色法1、只输出结果的单通道值,一般来说结果不太理想,比较节…

【数据结构--排序】堆排序

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Python的多重继承和MixIn

前言: 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。 回忆一下Animal类层次的设…

使用SSH连接虚拟机一直提示填写密码

查看ssh服务是否开启 service ssh status 上面的报错,查看ssh、sshd是否都已安装:ps -e| grep ssh 这里显示没有安装sshd 安装sshd:sudo apt-get install openssh-server centos和ubantu的安装指令不一样,centos是使用yum指令进…

北大C++课后记录:文件读写的I/O流

前言 文件和平常用到的cin、cout流其实是一回事,可以将文件看作一个有限字符构成的顺序字符流,基于此,也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注:这里的指针并不是普…

8年经验之谈 —— App测试常用的两种工具

一、监控工具 DDMS的全称是Dalvik Debug Monitor Service ,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。 启动DDMS Eclipse中启…

操作系统权限提升(二十八)之数据库提权-SQL Server 数据库安装

SQL Server 数据库安装 SQL Server介绍 SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。…

Windows 基于Visual Studio 开发Qt 6 注意事项

前提条件: 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 Qt Vistual Studio Tools下载 先打开Visual Studio 2022 社区版 : 点击扩展-》管理拓展按钮后,在搜索框中输入Qt,点击这里第一个扩展安装。 Qt Visual Stud…

ROS2 从头开始​​:第 1 部分 — 机器人操作系统简介

火星上的机器人(AI生成图像) 一、说明 ROS2是机器人的朋友,一个他们所依赖的平台,用于沟通、协调和控制,帮助他们实现目标。ROS2以DDS为核心,帮助机器人探索新世界、新任务、新可能性,是一个方…

单元测试的重要性

前言 在日常生活中,单元测试无论是对软件测试人员还是开发人员,都扮演着重要的角色。这主要是因为,单元测试在开发阶段,可以确保每个组件和程序都能够正常的运行。 很多开发人员都讨厌编写单元测试,但是它可以在开发…

李航老师《统计学习方法》第2章阅读笔记

感知机(perceptron)时二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面 想象一下在一个平面…

并发编程系列-CAS

锁(lock)的代价 锁是用来做并发最简单的方式,其代价也是最高的,Java在JDK1.5之前都是靠synchronized关键字来加锁。但是加锁机制会有如下几个问题: 加锁、释放锁会需要操作系统进行上下文切换和调度延时,在…

【操作系统笔记十二】Linux常用基础命令

Linux 常用快捷键 Tab 命令或路径等的补全键,特别常用的快捷键Ctrl insert 复制命令行内容(常用可提高效率)Shift insert 粘贴命令行内容(常用可提高效率)Ctrl C 中断当前任务(退出)Ctrl Z…

备份服务器数据库并保存到Git仓库

备份项目及数据库脚本 #!/bin/bash # MySQL数据库信息 DB_HOST"localhost" DB_USER"root" DB_PASS"************" DB_NAME"my-space" # 导出文件目录 EXPORT_PATH"/home/MySpace/mysql" # 获取当前时间并格式…

ES6-解构赋值

可以将值从数组或属性从对象提取道不同的变量中。 交换变量 let a 1 let b 2 [ a, b ] [ b, a ]//a2,b1 数组 const arr [1,2,3,4]; let [a,b,c,d] arr;//a1,b2,c3,d4 let [foo] []; let [bar, foo] [1];//bar1,fooundefined 防止从数组中取出一个值为undefined的对…

逆向-beginners之结构体-成员地址访问

#include <stdio.h> #include <time.h> /* * 字节型数组 */ int main() { struct tm t; time_t unix_time; int i0, j0; unix_time time(NULL); localtime_r(&unix_time, &t); for (i 0; i < 9; i) { for (j 0; j < 4; j…

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…

Zookeeper高级_四字命令

之前使用stat命令来验证ZooKeeper服务器是否启动成功&#xff0c;这里的stat命令就是ZooKeeper 中最为典型的命令之一。ZooKeeper中有很多类似的命令&#xff0c;它们的长度通常都是4个英文字母&#xff0c;因此我们称之为“四字命令”。 添加配置 vim zoo.cfg 4lw.commands…

C++之类和函数权限访问总结(二百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…