請考慮下面的代碼片段(小提琴here):不同的行爲刪除關鍵字的
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
爲什麼delete
關鍵字的行爲不同的全局變量a
和b
?
請考慮下面的代碼片段(小提琴here):不同的行爲刪除關鍵字的
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
爲什麼delete
關鍵字的行爲不同的全局變量a
和b
?
delete運算符從刪除的對象的屬性。
全局變量(不var
)是全局對象(通常爲window
)上的屬性,因此可以刪除。
A var
不是全局變量,而是外部作用域中的局部變量 - 不是全局對象的屬性 - 因此delete
不會將其刪除。從這些文檔:
x = 42; // creates the property x on the global object
var y = 43; // declares a new variable, y
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
聲明和未聲明的全局變量都是全局對象的屬性。它們僅根據「可配置」屬性的值而有所不同。欲瞭解更多信息,請參閱:http://stackoverflow.com/a/16007360/1306809 –
MDN說刪除只有屬性存在,不能刪除時返回false。它在所有其他情況下返回true。刪除後,嘗試測試實際值。你會看到a
未被刪除。這是因爲,如MDN頁面所示,delete
不會影響變量名稱。
它對變量或函數名稱沒有影響。
(即,與var
和不脫全局對象定義)
看看下頁的例子。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete
不同的是,聲明的變量是全局對象的非可配置的屬性,而沒有標明的是可配置的。
var a;
- >這是一個聲明的變量,因爲您使用的是var
,所以它是不可配置的。
a = 6;
- >這是一個未聲明的變量,因爲您沒有使用var
,所以它是可配置的。上述
兩種語法將結束與一個名爲a
附加爲全局對象(通常window
)和屬性的屬性變種具有以下屬性:
是從ecmascript5 objects and properties提取,你可以閱讀,有問題的變量的configurable
屬性會影響變量是否可以或不可以被刪除。
+1這是問題的最佳答案。接受的答案並不完全準確。 –
「VAR一個」意味着它不能被從任何地方當前塊的外部訪問,從而刪除它將平均UNDECLARE(未一樣未定義),從而允許在相同的再次寫入「一個變種」塊(錯誤)。
允許的用途(MDN):
delete object.property
delete object['property']
delete object[index]
delete property
這就像GOTO和非結構化的編程,你可能需要手動清理資源,這是種〜析構函數在C(雖然不一樣)。你可以刪除一個對象,如〜a();但是你不能像'int i'那樣''UNDECLARE'變量'。
MDN表示只有屬性存在且不能刪除才返回false。它在所有其他情況下返回true。刪除後,嘗試測試實際值。你會看到'a'沒有被刪除。 – jeremy
@尼爾:是的,行爲是不同的。我不明白這是怎麼解釋的。 – Randomblue
它的行爲不同_因爲它被定義爲_?你還想要什麼? – Eric