delete 操作符 刪除對像屬性及相關知識

2021-07-24 16:56:19 字數 1516 閱讀 7750

首先:

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...