オブジェクトの属性deleteを削除する使い方
3321 ワード
Javascriptの変数
実際のJavaScriptでは、変数=オブジェクト属性というのはJavascriptがスクリプトを実行する前にGlobalオブジェクトを作成し、すべてのグローバル変数はこのGlobalオブジェクトの属性であり、実行関数を実行する時にはActivationオブジェクトを作成し、すべてのローカル変数はこのActivationオブジェクトの属性であるからです.以下の例:
C++の中にもdelete操作子がいますが、削除されたのはポインタが指すオブジェクトです.たとえば:
「削除対象ではなく属性を削除する」という点は、以下のコードで確認できます.
変数に対してdeleteを実行する場合
変数もGlobalまたはActivationオブジェクトの属性ですので、変数のdelete操作も同じ結果です.
すべての属性がdeleteされるわけではない.例えば、prototypeで宣言されている属性はdeleteされません.
varによって宣言された変数と、functionによって宣言された関数は、DotDelete特性を持っていますので、削除できません.
deleteは普通の演算子です.trueまたはfalseに戻ります.ルールは、deleteのオブジェクトの属性が存在し、DotDeleteを持つとfalseに戻ります.そうでなければtrueに戻ります.ここの特徴の一つは、オブジェクト属性が存在しない時もtrueに戻るので、戻り値は完全に削除成功と同じではないということです.
実際のJavaScriptでは、変数=オブジェクト属性というのはJavascriptがスクリプトを実行する前にGlobalオブジェクトを作成し、すべてのグローバル変数はこのGlobalオブジェクトの属性であり、実行関数を実行する時にはActivationオブジェクトを作成し、すべてのローカル変数はこのActivationオブジェクトの属性であるからです.以下の例:
var global = 42;
this.global; // 42, this Global
this.global2 = 12;
global2; // 12
function foo() {
var local = 36;
// Activation,
// foo.local local
}
delete操作子削除の対象C++の中にもdelete操作子がいますが、削除されたのはポインタが指すオブジェクトです.たとえば:
// C++
class Object {
public:
Object *x;
}
Object o;
o.x = new Object();
delete o.x; // new Object
しかし、JavascriptのdeleteはC++とは違って、o.x方向のオブジェクトを削除するのではなく、o.x属性自体を削除します.// Javascript
var o = {};
o.x = new Object();
delete o.x; // new Object
o.x; // undefined,o x
実際のJavascriptでは、delete o.xの後、Objectの対象は引用を失ってゴミに回収されるので、delete o.xは「相当」としてO.xの対象を削除しましたが、この動作はECMAScriptの基準ではありません.つまり、ある実現が完了してもObjectの対象を削除しないとしても、ECScriptの基準に違反しません.「削除対象ではなく属性を削除する」という点は、以下のコードで確認できます.
var o = {};
var a = { x: 10 };
o.a = a;
delete o.a; // o.a
o.a; // undefined
a.x; // 10, { x: 10 } a ,
また、delete o.xはdelete o[x]とも書くことができ、両者の効果は同じです.変数に対してdeleteを実行する場合
変数もGlobalまたはActivationオブジェクトの属性ですので、変数のdelete操作も同じ結果です.
var global = 42;
delete global; // Global.global
function foo() {
var local = 36;
delete local; // Activation.local
}
削除できる属性と削除できない属性すべての属性がdeleteされるわけではない.例えば、prototypeで宣言されている属性はdeleteされません.
function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C();
o.x; // 42, o.x
delete o.x;
o.x; // 12, prototype o.x, delete o.x
オブジェクトの事前定義属性も削除できません.これらの属性はDotDeleteの特性を持つと考えられています.var re = /abc/i;
delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase
削除できる変数と削除できない変数varによって宣言された変数と、functionによって宣言された関数は、DotDelete特性を持っていますので、削除できません.
var x = 36;
delete x;
x; // 36, x
y = 12;
delete y;
y; // undefined
function foo() { return 42; }
delete foo;
foo(); // 42
ただし、例外として、evalで実行されるコードの中で、varで宣言された変数は正常なvar宣言変数と同じGlobalオブジェクトに属していますが、DotDelete特性を持たず、削除されます.eval("var x = 36;");
x; // 42
delete x;
x; // undefined
しかし、これは例外があります.evalのコードの関数内でvarによって定義された変数はDotDeleteを持っています.削除されません.eval("(function() { var x = 42; delete x; return x; })();");
// 42
deleteの戻り値deleteは普通の演算子です.trueまたはfalseに戻ります.ルールは、deleteのオブジェクトの属性が存在し、DotDeleteを持つとfalseに戻ります.そうでなければtrueに戻ります.ここの特徴の一つは、オブジェクト属性が存在しない時もtrueに戻るので、戻り値は完全に削除成功と同じではないということです.
function C() { this.x = 42; }
C.prototype.y = 12;
var o = new C();
delete o.x; // true
o.x; // undefined
"x" in o; // false
// o.x DontDelete, true
delete o.y; // true
o.y; // 12
// o o.y , true
// prototype , prototype
delete o; // false
// Global.o DontDelete false
delete undefinedProperty; // true
// Global undefinedProperty true
delete 42; // true
// 42 true。 ( ECMAScript )
var x = 24;
delete x++; // true
x; // 25
// x++ (24), , true