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

您应该使用本机数组函数之一,例如spliceshift

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

或者

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

delete只会删除元素的引用。它不会更新数组的逻辑,并且没有优雅的方法来获取这样一个损坏的数组中的变量的实际计数(请参阅Jon 的建议)。所以使用shift,pop或.splicevar newarray = oldarray.slice

也可以看看:

于 2012-04-18T22:16:23.517 回答
2

这确实是对 Javascript 数组的误用,所以虽然有一种解决方法(使用for...in并计算名称为数字的属性的数量),但您肯定不会称它为优雅的(请参阅实际操作)。

不要使用delete也不要手动为元素分配索引(var colors = []; colors[1000] = 'red';);这不是数组的使用方式。

于 2012-04-18T22:15:01.913 回答
1

用于delete删除数组中的项目,但在数组中留下“洞”。它删除了值,但不是“空格”,使数组仍然具有相同的长度。

要删除一个值以及该数组中的空间,请使用splice

array.splice(colours.indexOf('red'),1); //remove 1 item starting from index
于 2012-04-18T22:20:35.777 回答
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 回答