オブジェクトの属性deleteを削除する使い方

3321 ワード

Javascriptの変数
実際の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