在javascript中,我們有時候要使用delete刪除對象。但是,對於delete的一些細節我們未必盡知。昨天,看到kangax分析delete的文章,獲益匪淺。本文將文章的精華部分翻譯出來,與各位分享。
- 原理
- 代碼類型
- 執行內容
- 啟用物件/可變對象
- 屬性特性
- 內建對象和DontDelete
- 未聲明的賦值
- Firebug 困惑
- 通過eval刪除變數
- 瀏覽器安全色性
- Gecko DontDelete bug
- IE bugs
- 誤區
- ‘delete’和宿主對象
- ES5strict 模式
- 總結
原理
為什麼我們能刪除一個對象的屬性?
var
o = { x: 1 };
delete
o.x;
// true
o.x;
// undefined
但是,像這樣聲明的變數則不行:
var
x = 1;
delete
x;
// false
x;
// 1
或者如此聲明的函數:
function
x(){}
delete
x;
// false
typeof
x;
// "function"
注意,當一個屬性不能被刪除時,delete
只返回false。
要理解這一點,我們首先需要掌握像變數執行個體化和屬性特性這樣的概念--遺憾的是這些在關於javascript的書中很少講到。我將在接下來的幾個段落中試著簡明的重溫這些概念。 理解它們一點也不難,如果你不在乎它們為什麼這麼運行,你可以隨意的跳過這一章。
代碼類型
在ECMAScript中有三種類型的可執行代碼:全域代碼(Global code)、函數代碼(Function code)和Eval code。這些類型有那麼點自我描述,但這裡還是作一個簡短的概述:
- 當一段原始碼本文被視為程式時,它在全域範圍中執行,被當成全域代碼(Global code)。在一個瀏覽器環境中,SCRIPT元素中的內容通常被當作程式來解析,因此,它被當作全域代碼來評估。
- 在一個函數內部直接執行的任何代碼,很明顯被當作函數代碼(Function code)。在瀏覽器紅中事件屬性的內容(如:
<p onclick="...">
)通常被當作函數代碼(Function code)來解析;
- 最後,提供給內建函數eval()的文本被當作Eval 代碼(Eval code)來解析。我們很快會看到這種類型很特殊。