首先:
delete操作符通常用來刪除物件的屬性,而不是一般的變數和函式。
例子:
//物件
var o = ;
delete o.x; // true
o.x; // undefined
//變數
var x = 1;
delete x; // false
x; // 1
//函式
function
x(){}
delete x; // false
typeof x; // "function"
變數屬性的標記
我 們已經知道宣告變數時發生了什麼(他們都變成了當前上下文物件的屬性),接下來我們就要看一下屬性究竟是怎麼樣一回事。每乙個變數屬性都可以有以下任意多 個屬性: readonly, dontenum, dontdelete, internal。你可以把這些當做標記,標明了變數屬性可以持有的某種特性。這裡我們最感興趣的就是dontdelete標記。
在 宣告變數或者函式時,他們都變成了當前上下文物件的屬性–對於函式**來說是活動物件,對於全域性**來說則是變數物件,而值得注意的是這些屬性在建立時 都帶有dontdelete標記,但是顯式或者隱式的賦值語句所產生的屬性並不會帶有這個標記!這就是為什麼有一些屬性我們可以刪除,但另一些卻不可以:
內建物件與dontdelete
dontdelete就是乙個特殊的標記,用來表明某乙個屬性能否被刪除。需要注意的是一些內建的物件是自動持有這個標記的,從而不能被刪除,比如函式內的arguments,以及函式的length屬性。
但是注意:
在eval中宣告的變數建立時都不會帶有dontdelete標記!
eval('var foo = 1;');
foo; // 1
delete foo; // true
typeof foo; // "undefined"
在函式內部也是一樣的:
(function
())();
firebug的困擾
在firebug中能被刪除(但是google流浪器中不能):
>> var sum = function
(a, b)
>>> var add = sum;
>>> delete sum
true
>>> typeof sum;
"undefined"
在firebug控制台中的**最終將通過eval執行,而不是作為全域性**或函式**。顯然地,這樣宣告出來的變數都不會帶dontdelete標記,所以才能被刪除!(譯者:也不能太信任firebug啊。) JS刪除與delete操作符
我以為的刪除以及我的測試var a 1 b 2 let c 3 const d 4 console.log delete a false console.log delete b true console.log delete c false console.log delete d false c...
C 中過載delete操作符
在c 中,過載delete operator的乙個非常重要的應用是 當使用者重定義了乙個new operator,並分配了資源。若在建立時發生異常,則編輯器會自動呼叫delete operator進行處理。見如下 示例 include class c c c int throw bad create...
JS中delete操作符的作用
總結 刪除物件屬性或變數 其實是刪除對映,如果屬性值被賦值給其他變數,該操作不會影響變數的值 釋放記憶體空間,其值變成undefined delete object.property delete object property 如下 delete obj.frends只是刪除了obj的friend...