[js]delete操作符學習

我們知道delete操作符只能刪除對象上的某些特殊屬性,該屬性的descriptor描述符必須滿足configurable描述符為true,方才可以刪除。

關于descriptor描述符

value,get,set,writable,configurable,enumerable

問個問題

現在了解了原理我們來回答一個問題,為什么delete操作符不能刪除var定義的變量,但是卻可以刪除沒有經過var定義的全局變量?

因為按理說每個全局變量都掛載到了this上面啊(無論nodejs中的global還是pc中的window)不能通過delete this.foo進行刪除嗎?

這是為什么呢?

delete is only effective on an object's properties. It has no effect on variable or function names.While sometimes mis-characterized as global variables, assignments that don't specify an object (e.g. x = 5) are actually property assignments on the global object.

或者你可以說,規范中就這么規定的,不能刪除聲明的變量和方法名。

var 聲明對屬性描述符configurable的影響

configurable:false是導致該變量無法被刪除的原因。

沒有經過var聲明的變量屬性描述符configurable的情況

所以,如果設置全局變量的時候對其configurable屬性描述符進行設置,就能使用delete操作符對該變量進行刪除了。


一種新的的設置全局變量的方式,不建議編碼時使用

哪些屬性也不可以刪除?

//內置對象的內置屬性不能被刪除
delete Math.PI; // 返回 false
//你不能刪除一個對象從原型繼承而來的屬性(不過你可以從原型上直接刪掉它).
 function Foo(){}
 Foo.prototype.bar = 42;
 var foo = new Foo();
 // 無效的操作
 delete foo.bar;       
 // logs 42,繼承的屬性
 console.log(foo.bar);       
 // 直接刪除原型上的屬性
 delete Foo.prototype.bar;
 // logs "undefined",已經沒有繼承的屬性
 console.log(foo.bar);

這個刪除效果應該和a=null;是等效的嗎?

Unlike what common belief suggests, the delete operator has nothing to do with directly freeing memory (it only does indirectly via breaking references. See the memory managementpage for more details).

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,082評論 6 13
  • JS基礎講解 JavaScript組成ECMAScript:解釋器、翻譯DOM:Document Object M...
    FConfidence閱讀 580評論 0 1
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • “你一定要利用上下文自己已經了解的所有字句,來推敲出自己不了解的那個字的意義”我就問問這不是廢話,我自己都知道。作...
    爺凌丶貝勒閱讀 460評論 0 0
  • 做一個心大的人,該吃吃,該喝喝,天塌下來有高個子的人頂著,N覺醒來你又是一條好漢! 01 給失戀的人 很多人都經歷...
    聲聲曼man閱讀 813評論 0 1