2017-11-23 23 views
2

私はjs 'delete'演算子と少し混乱しています。この場合「削除」はどのようにjavascriptで機能しますか?

例えば

var data = { 
    list : [a, b, c] 
} 
var temp = data; 

console.log(temp.list[2]); //Result 'c' 
console.log(data.list[2]); //Result 'c' 

delete temp.list[2]; 

console.log(temp.list[2]); //Result undefined 
console.log(data.list[2]); //Result undefined why? 

、 は、私はちょうどのみtemp.list[2]を削除したが、data.list[2]も同様に未定義を示しています。

演算子トレースの配列アドレスを '削除'してデータを削除しますか? その理由はdata.list[2]も未定義ですか? (data.list[2]には実際のデータではなくアドレスがあるので) 説明があると思います。手伝って頂けますか?

+4

削除とは関係ありません。これは、tempとデータが同じ配列を参照しているという事実と関係しています –

+0

[JavaScriptを使用した値による配列のコピー](https://stackoverflow.com/questions/7486085/copying-array-by-value-in- javascript?rq = 1) 'var temp = data;'が独立したコピーを作成しない理由を確認してください。 – Paul

答えて

1

JSの複合型は、明示的にコピーしない限り、参照渡しされます。

2

は、他の人が投稿したすべての偉大な参照をチェックしてください。しかし、簡単な解決策として、ES6スプレッド演算子を使用してコピーを作成します。

var data = { 
    list : ["a", "b", "c"] 
    } 
    var temp = {...data}; // this is now a copy not a reference 
これは、削除問題をイマイチつまり

More on the spread operator

は、コピーの問題対その参照が

+0

これはこれまで普及している演算子の中で最もばかげた虐待です... upvoteを持ってください! – vzwick

1

あなたの質問はいくつかのトピックに触れる:

まず、delete演算子は、指定されたプロパティを削除します配列から要素を削除する場合は、配列の長さには影響しません。

let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; 
delete trees[3]; 
alert(trees.length); //shows 5 

これが必要でない場合は、代わりにspliceメソッドを使用することを検討してください。それは本当に強力であり、要素を削除するためだけでなく使用することができます。

let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; 
trees.splice(3, 1); 
alert(trees.length); //shows 4 

第二には、誰もがすでに述べたように、var temp = data;があなたのオブジェクトのコピーを作成しません、それだけでコピー参照です。あなたのオブジェクトの完全同一の浅いクローンを作成するには、次のように書くことができます:

let clone = Object.create(Object.getPrototypeOf(obj), 
    Object.getOwnPropertyDescriptors(obj)); 

この呼び出しは、すべてのプロパティを含むOBJの真の正確なコピーを、作る:可算・非可算、データの性質とセッター/ゲッター - すべての場合、Object.assign()メソッドは、ソースオブジェクトからターゲットオブジェクトに列挙可能なプロパティと自身のプロパティのみをコピーする場合

関連する問題