宣言された変数では削除演算子が機能しないため、JavaScriptの宣言された変数と宣言されていない変数の主な違いは何ですか?
var y = 43; // declares a new variable
x = 42;
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)
なぜこれが起こるのですか?グローバルに宣言された変数は、ウィンドウオブジェクトのプロパティでもあるので、削除できないのはなぜですか?
それらを保存してアクセスするメカニズムは同じですが、JavaScriptはconfigurable
属性の値に基づいてそれらを異なる方法で処理する場合があります(以下で説明)。通常の使用では、それらは同じように動作するはずです。
declaredとundeclaredグローバル変数の比較を以下に示します。
var declared = 1; // Explicit global variable (new variable)
undeclared = 1; // Implicit global variable (property of default global object)
window.hasOwnProperty('declared') // true
window.hasOwnProperty('undeclared') // true
window.propertyIsEnumerable('declared') // true
window.propertyIsEnumerable('undeclared') // true
window.declared // 1
window.undeclared // 1
window.declared = 2;
window.undeclared = 2;
declared // 2
undeclared // 2
delete declared // false
delete undeclared // true
delete undeclared // true (same result if delete it again)
delete window.declared // false
delete window.undeclared // true (same result if delete it yet again)
delete window.undeclared // true (still true)
declaredとundeclaredの両方のグローバル変数は、window
オブジェクト(デフォルトのグローバルオブジェクト)のプロパティです。どちらもプロトタイプチェーンを通じて別のオブジェクトから継承されません。どちらもwindow
オブジェクトに直接存在します(- window.hasOwnProperty
は両方に対してtrue
を返します)。
declaredグローバル変数の場合、configurable
属性はfalse
です。 undeclaredグローバル変数の場合、true
です。以下に示すように、configurable
属性の値は getOwnPropertyDescriptor
メソッドを使用して取得できます。
var declared = 1;
undeclared = 1;
(Object.getOwnPropertyDescriptor(window, 'declared')).configurable // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable // true
プロパティのconfigurable
属性がtrueの場合、プロパティの属性は defineProperty
メソッドを使用して変更でき、プロパティは-を使用して削除できます delete
演算子。そうしないと、属性を変更できず、この方法でプロパティを削除できません。
非厳密モード の場合、delete
演算子は、プロパティが構成可能な場合はtrue
を返し、構成できない場合はfalse
を返します。
宣言されたグローバル変数
window
)のプロパティですdelete
演算子を使用して削除できない宣言されていないグローバル変数
window
)のプロパティですdelete
演算子を使用して削除できます主な違いは、関数内で変数を宣言する場合です。関数内で変数を宣言するときにvar
を使用すると、その変数はローカル変数になります。ただし、var
を使用しない場合は、宣言した場所(関数の内部または外部)に関係なく、変数はグローバル変数になります。
JavaScriptの変数宣言を介して変数が作成されると、これらのプロパティは「DontDelete」属性で作成されます。作成した「削除」式を使用して削除することはできません。すべての関数、引数、関数パラメーターは、デフォルトではこのDontDelete属性で作成されます。 DontDeleteはフラグと考えることができます。
var y = 43;
delete y; //returns false because it is has a DontDelete attribute
一方、宣言されていない割り当てでは、DontDeleteのような属性は設定されません。したがって、この宣言されていない変数にdelete演算子を適用すると、trueが返されます。
x = 42;
delete x; //returns true because it doesn't have a DontDelete attribute
プロパティの割り当てと変数の宣言の違い—前者はそうではなく、後者はDontDeleteを設定します。そのため、宣言されていない割り当てによって削除可能なプロパティが作成されます。
削除は、オブジェクトのプロパティに対してのみ有効です。変数名や関数名には影響しません。
あなたの場合、x = 42;変数Xを宣言し、グローバルオブジェクトのプロパティにします。つまり、trueを返します。
そして、var y = 43;オブジェクトの一部ではないグローバル変数を宣言しているため、falseを返します。