2014-02-28 72 views
5

我正在爲此尋找合適的解釋,但無法找到解答我的問題的解釋。JavaScript刪除對象在不同瀏覽器中的行爲有所不同

我在JavaScript中讀到,對象無法刪除。所以爲了找出答案,我在瀏覽器的控制檯中玩耍。我創建這樣一個對象:

var a = {x:10}; 

然後我做了delete a.x其返回true(這裏沒有驚喜)

再接着刪除這樣的對象:delete a

但什麼難倒我了,而Google Chrome返回falseFirefox返回true

怎麼可能某個對象是在一個瀏覽器,而不是在另一個「刪除」?有什麼我在這裏失蹤或是瀏覽器的實現,導致這一點?

在FF V27: Firefox Console

在谷歌瀏覽器V33 Google Chrome Console

回答

2

這是由於Firefox和Chrome中運行控制檯代碼的內部方法不同所致。

在Firebug中,控制檯代碼使用a form of eval for extension code進行評估。但是,在Chrome中,控制檯中的代碼是evaluated using internal methods ,它模擬運行的實際代碼,而不是直接使用JavaScript的eval函數。

[[Configurable]]內部屬性描述符屬性確定嘗試刪除變量/屬性是否成功。如果爲false,則不會刪除該屬性,並且delete運算符將返回false。

在eval代碼中定義的任何變量都有[[Configurable]]設置爲true。但是,如果您定義了一個傳遞給eval的代碼以外的變量,那麼該屬性將設置爲false

eval和其他類型的可執行代碼之間的行爲的這種差異在ECMAScript標準下部分10.5指定:

2.如果代碼是EVAL代碼,然後讓configurableBindings否則讓可配置綁定虛假

1:這個代碼僅是前端代碼,而不是實際的內部結構,其下降很多層面。

+0

謝謝!現在有道理。 :) –

1

我發現this:它似乎是一個Firebug問題:當你在Chrome中使用內置的開發工具時,它直接使用JS引擎。Firebug是一個用JS創建的插件,所以執行某些操作的唯一方法是使用「eval」,這看起來並不是將「不刪除」屬性添加到對象。

刪除刪除對象,但不刪除變量。

1

我會添加一些點@澳航的回答是:

根據MDN delete operator reference

返回 拋出,如果財產是自己的非配置 財產嚴格模式(返回假非嚴格)。在所有其他 個案中返回true。

這意味着,一個不可配置的變量不能通過刪除操作刪除。但是,如果一個變量是可配置的,就像在@澳航的答案中一樣,它是在eval()中定義的,那麼它可以使用刪除操作符來刪除。

相關問題