在Javascript数组中,它们的索引可能存在间隙,不应该与未定义的元素混淆:
var a = new Array(1),i;
a.push(1,undefined);
for (i = 0; i < a.length; i++) {
if (i in a) {
console.log("set with " + a[i]);
} else {
console.log("not set");
}
}
// logs:
// not set
// set with 1
// set with undefined
由于这些间隙破坏了长度属性,我不确定,如果可能的话应该避免它们.如果是这样,我会将它们视为边缘情况,而不是默认情况下:
// default:
function head(xs) {
return xs[0];
}
// only when necessary:
function gapSafeHead(xs) {
var i;
for (i = 0; i < xs.length; i++) {
if (i in xs) {
return xs[i];
}
}
}
除了head非常简洁之外,另一个优点是它可以用于所有类似数组的数据类型.头只是一个简单的例子.如果在整个代码中需要考虑这些差距,则开销应该是显着的.
最佳答案
这很可能出现在任何重载哈希表的语言中,以提供通俗称为“数组”的东西. PHP,Lua和JavaScript是三种这样的语言.如果您依赖于严格的顺序数字数组行为,那么这将给您带来不便.更一般地说,该行为也提供了便利.
这是一个经典的算法问题:从数据结构中间删除一个成员,哪个数据结构“更好”:一个链表还是一个数组?
您应该说“链表”,因为从链表中删除节点不需要您将数组的其余部分向下移动一个索引.但链接列表还有其他陷阱,那么我们可以使用另一种数据结构吗?您可以使用稀疏数组*.
在许多提供这种类型的数组的语言中,删除数组的任意成员都会改变长度.不幸的是,JavaScript并没有改变长度,所以你在那里失去了一点点.但是,尽管如此,数组“更短”,至少从Object.keys的角度来看.
*许多sparse arrays是使用链接列表实现的,所以不要太常用.但是,在这些语言中,它们是具有可预测的有序数字键的哈希表.