0

JavaScript には、あちこちに面白い癖があります。この素晴らしい投稿から抜粋したこの癖を考えてみてください(これを共有してくれた M. Staveley に感謝します)。

var colours = ['red', 'green', 'blue']
// is red really in the array?
console.log(colours.indexOf('red') > -1);  // outputs true. 
// remove red, it's going out of fashion!
delete colours[colours.indexOf('red')];
console.log(colours.indexOf('red') > -1);  // outputs false
console.log(colours.length) // length is still three, remember it's javascript!

最後の行は私を悩ませているものです。この癖は私の好奇心を最大限に引き出します.実際の数にアクセスするためのエレガントな方法はcolours何ですか?

4

5 に答える 5

2

delete要素の参照のみを削除します。配列のロジックは更新されず、そのような壊れた配列内の変数の実際の数を取得するエレガントな方法はありません ( Jon の提案を参照)。shiftpopspliceまたはを使用しますvar newarray = oldarray.slice

以下も参照してください。

于 2012-04-18T22:16:23.517 に答える
2

使用しないでくださいdelete

またはのようなネイティブ配列関数のいずれかを使用する必要があります。spliceshift

colours.shift();
console.log(colours.length);

また

colours.splice(colours.indexOf('red'), 1);
console.log(colours.length);
于 2012-04-18T22:13:30.000 に答える
2

これは実際には Javascript 配列の誤用であるため、回避策 (for...in名前が数値であるプロパティの数を使用してカウントする) はありますが、エレガントとは言えません (実際の動作を参照してください)。

要素にインデックスを使用deleteしたり、手動で割り当てたりしないでください ( var colors = []; colors[1000] = 'red';); 配列の使用方法ではありません。

于 2012-04-18T22:15:01.913 に答える
1

delete値を に設定するだけでundefined、配列から削除しません。

delete colours[colours.indexOf('red')];

配列は次のようになります。

[undefined, 'green', 'blue']

ご覧のとおり、長さは 3 のままです。配列から値を削除するには、 を使用できますsplice

colours.splice(colours.indexOf('red'), 1);
于 2012-04-18T22:19:25.153 に答える
1

を使用deleteして配列内の項目を削除しますが、配列に「穴」を残します。値は削除されますが、「スペース」ではなく、配列の長さが同じになります。

その配列内の値とスペースを削除するには、次を使用しますsplice

array.splice(colours.indexOf('red'),1); //remove 1 item starting from index
于 2012-04-18T22:20:35.777 に答える