js s s 6 delete

1860 ワード

前言
まずdeleteはnodejs deleteと違って、どんな違いがありますか?
本文
var test=5;
delete test;
console.log(test);
その結果、testは何の影響も受けず、依然として5を出力することができる.もう一つ:
var x={y:{z:5}};
var data=x.y;
console.log(x.y);//  {z:5}
delete x.y;
console.log(x);//  {}
console.log(x.y);//  undef
console.log(data);//  {z:5}
この時、私達が削除したのはxとyの連絡です.yのメモリアドレスはまだあります.私達はdeleteが戻り値があることを知っています.それならこのようにしましょう.削除が成功したかどうかを見てください.
 var test=5;
 var flag=delete test;
 console.log(flag);
この時はfalseに戻ります.それでは成功しませんでした.一体何が削除されますか?削除できますか?
問題探索
予想:
削除できるのは属性だけですか?またカスタム属性が必要ですか?
質問:上でtestを削除する時はglobalの属性です.カスタマイズ属性は成立しません.
global以外のカスタム属性は全部削除できますか?
var arr = [1,3,4,6,73,2]; 
delete arr[2]; 
console.log(arr.length); // 6 
console.log(arr[2]); //undefiend consoel.log(arr); 
//[ 1, 3, , 6, 73, 2 ]
実際に削除されたのはメモリ参照ですか?それともインデックスがundefindを指していますか?
前の例を通して、実際にはundefind、すなわち初期化されていません.
ここでは実はdeleteはタプルとobjectに対して処理方式が違っています.
この一連の問題を単一のものとして扱うことはできない.
質問を出す:
果たしてdeleteオブジェクトの属性は、その属性を空にしますか?それとも削除しますか?
レイシを見てください
var test={
	k:5
}
var testx=test;
delete test.k;
console.log(test);//{}
console.log(testx);//{}
空にしたのではなく、削除されたのが見えます.
次に暗黙的なグローバル変数とグローバル変数を表示します.
x=6;
var y=7;
delete x;
delete y;
console.log(y);//7
console.log(x);//undefine
暗黙的な宣言は削除できます.表示されている宣言は削除できません.
最後に他の人の削除配列の例を見ます.方式一:
var arr = [1,3,5,21,3,4,53,21,5,2]; 
arr.forEach(function(val,index){ if(val < 10){ delete arr[index]; } }) console.log(arr); //[ , , , 21, , , 53, 21, ,  ] //    filter      [ 21, 53, 21 ];
arr = arr.filter(function(val){return val});
方式二:
for(var i=0;i
想像してもいいですが、実は方式のほうが効率がいいです.毎回新しい配列を作る必要がないからです.