delete?語法的本質(zhì)深入解析
delete 的返回值
delete 語法是用于 JS 刪除對(duì)象屬性和數(shù)組元素
返回 boolean
類型
true 代表刪除沒有發(fā)生異常,但不一定是刪除成功
false 一定是刪除失敗
var obj = { a: 1, b: 2 }; // 刪除對(duì)象屬性 console.log(delete obj.a); // true // 刪除對(duì)象不存在的屬性 console.log(delete obj.name); // true // 刪除全局對(duì)象 obj ,因?yàn)?var 聲明默認(rèn)會(huì)掛載到全局 window 對(duì)象上 console.log(delete obj); // false console.log(obj); // { b: 2 }
delete 不能刪除哪些屬性
- 任何用
var
聲明的屬性,不能從全局或函數(shù)作用域刪除 - 任何用
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 刪除原型上的屬性
- 不會(huì)遍歷原型鏈刪除
function User() { this.name = "云牧"; } User.prototype.name = "黛玉"; const p = new User(); // 刪除的是 p 對(duì)象的自身屬性 console.log(delete p.name); // true // p.name 依然可用,因?yàn)樵玩溈梢圆檎业?name console.log(p.name); // 黛玉 // 刪除原型上的屬性 console.log(delete User.prototype.name); // true // 實(shí)例和原型上都沒有 name console.log(p.name); // undefined
delete 刪除的到底是什么
- 刪除的是操作表達(dá)式結(jié)果
- 對(duì)于值,字面量或不可達(dá)的引用,不操作,直接返回 true
- 引用類型,刪除引用
var nameVar = "nameVar"; nameNotVar = "nameNotVar"; // var 聲明的不可以刪除 console.log(Object.getOwnPropertyDescriptor(window, "nameVar")); // configurable: false // 非 var 聲明的可以刪除 console.log(Object.getOwnPropertyDescriptor(window, "nameNotVar")); // configurable: true
嚴(yán)格模式刪除報(bào)錯(cuò)
- 對(duì)于 變量,函數(shù)名,函數(shù)參數(shù):
SyntaxError
- 對(duì)于
configurable: false
:TypeError
- 典型的
delete super.property
:ReferenceError
下面是錯(cuò)誤的例子:
"use strict"; // 變量 var name = "name"; delete name; // 函數(shù)和函數(shù)參數(shù) function fn() {} delete fn; function fn(name) { delete name; } fm(); // configurableTypeError const person = { name: "帥哥" }; Object.defineProperty(person, "name", { configurable: false }); delete person.name; // 嚴(yán)格 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 語法的本質(zhì)深入解析的詳細(xì)內(nèi)容,更多關(guān)于delete 語法解析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Skypack布局前端基建實(shí)現(xiàn)過程詳解
這篇文章主要為大家介紹了Skypack布局前端基建過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07rollup打包引發(fā)對(duì)JS模塊循環(huán)引用思考
這篇文章主要為大家介紹了rollup打包引發(fā)的對(duì)JS模塊循環(huán)引用的思考,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08JavaScript中MutationObServer監(jiān)聽DOM元素詳情
這篇文章主要給大家分享的是?JavaScript中MutationObServer監(jiān)聽DOM元素詳情,DOM的MutationObServer接口,可以在DOM被修改時(shí)異步執(zhí)行回調(diào)函數(shù),我的理解就是可以監(jiān)聽DOM修改。下面來看看文章的詳細(xì)內(nèi)容,需要的朋友可以參考一下2021-11-11Hardhat進(jìn)行合約測(cè)試環(huán)境準(zhǔn)備及方法詳解
這篇文章主要為大家介紹了Hardhat進(jìn)行合約測(cè)試環(huán)境準(zhǔn)備及方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03微信小程序 (三)tabBar底部導(dǎo)航詳細(xì)介紹
這篇文章主要介紹了微信小程序 (三)tabBar底部導(dǎo)航詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-09-09