javascript - 删除未定义的属性和由 const 声明的属性有什么区别,让在 Javascript 中使用 delete 运算符?
问题描述
请看代码,
foo = 1;
delete foo; // true
Object.getOwnPropertyDescriptor(this,'foo').configurable // true
var bar = 2;
delete bar; // false
Object.getOwnPropertyDescriptor(this,'bar').configurable // false
const fooBar = 3;
Object.getOwnPropertyDescriptor(this,'fooBar').configurable // undefined
delete fooBar; //false
Object.getOwnPropertyDescriptor(this,'noexist').configurable // undefined
delete noexist; // true
基于MDN,delete 操作符只能与它们自己的描述符可配置的属性一起使用true
,那么为什么 delete “fooBar” 和 “noexist” 返回值之间存在差异?
解决方案
const
使用或未let
分配给全局对象的变量,因此您的
const fooBar = 3;
当你这样做时没有出现
Object.getOwnPropertyDescriptor(this,'fooBar').configurable
只有使用声明的变量var
(或根本没有声明,只分配给,例如 with foo
)被分配给全局对象。
delete
将返回:
对于所有情况都为 true,除非该属性是自己的不可配置属性,在这种情况下,在非严格模式下返回 false。
window.foo
, 没有用 , 或 , 声明var
是let
一个const
可配置的属性。window.bar
,用你的 , 声明的var bar
,被分配给window
一个不可配置的属性。
delete fooBar
返回,false
因为fooBar
尽管实际上不是 on 的属性,但它window
是一个无法删除的独立标识符 -delete
将导致false
无论何时使用delete
这样的方法都会在严格模式下引发错误:
'use strict';
const someVar = true;
delete someVar;
但是noexist
不是代码中的标识符,因此甚至没有尝试执行的操作,因此它返回true
(并且在严格模式下不会引发错误)。
推荐阅读
- google-cloud-platform - 在没有角色/所有者的 GCP 上部署 Kubeflow 1.3
- javascript - ava 抛出 npm ERR!当 sinon 存根抛出新错误时测试失败
- java - java - 如何在Java中的Android Studio中比较具有相同JSON中相同键的JSON对象?
- r - 如何将此数据框写入excel(xlsx)?
- javascript - 合并2个html5画布的捕获视频流
- embedded - 如何从 LSM6DSOXTR 读取陀螺仪值?
- forms - 表单输入背景颜色在加载后一毫秒从指定的浅黄色变为浅蓝色
- amazon-redshift - 用户权限查询上的redshift listagg
- javascript - RactJs/Laravel - 无法提交表单的问题
- android - 我们检测到您的应用正在使用旧版本的 Google Play 结算。到 2021 年 11 月,所有应用更新必须使用版本 3 或更新版本