Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 索引中存在差距的数组是否具有弥补其缺点的好处_Javascript_Arrays - Fatal编程技术网

Javascript 索引中存在差距的数组是否具有弥补其缺点的好处

Javascript 索引中存在差距的数组是否具有弥补其缺点的好处,javascript,arrays,Javascript,Arrays,在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 w

在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
var a=新数组(1),i;
a、 推送(1,未定义);
对于(i=0;i
由于这些间隙损坏了长度属性,我不确定是否应尽可能避免它们。如果是这样,我会将它们视为边缘情况,而不是默认情况:

// 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];
    }
  }
}
//默认值:
功能头(xs){
返回xs[0];
}
//仅在必要时:
函数gapSafeHead(xs){
var i;
对于(i=0;i

除了
head
非常简洁之外,另一个优点是它可以用于所有类似数组的数据类型
head
只是一个简单的例子。如果需要在整个代码中考虑这些间隙,那么开销应该很大。

当然,这是一个主观问题,但我认为,如果可能的话,这些间隙当然应该避免。数组是具有特定用途的特殊Javascript对象。你可以完全破解数组,操纵length属性,添加键不是数字的属性(例如myArray[“foo”]=“bar”),但这些大部分都会转化为反模式。如果您需要某种特殊形式的伪数组,您可以使用常规对象自己编写它。毕竟,typeof[]=“object”

这并不是说间隙天生就破坏了你的代码,但我会避免故意追求它们


这是否回答了您的问题?

这可能出现在任何重载哈希表以提供通俗地称为“数组”的内容的语言中。PHP、Lua和JavaScript就是这样的三种语言。如果您依赖于严格的顺序数字数组行为,那么这将给您带来不便。更一般地说,这种行为也提供了便利

这里有一个经典的算法问题:要从数据结构的中间删除成员,哪个数据结构“更好”:链表还是数组

您应该说“链表”,因为从链表中删除节点不需要将数组的其余部分下移一个索引。但是链表还有其他缺陷,所以我们是否可以使用其他数据结构?您可以使用稀疏数组*

在许多提供这种散列类型数组的语言中,删除数组的任意成员将更改长度。不幸的是,JavaScript并没有改变长度,因此您在这方面会有一些损失。但是,至少从
Object.keys
的角度来看,数组“更短”


*很多都是使用链表实现的,所以不要太笼统地应用它。然而,在这些语言中,它们是具有可预测的有序数字键的哈希表。

I,这一次,我避免了像瘟疫一样的间隙。如果它们确实是索引并使用“经典”数组,那么是的,避免间隙是有意义的。如果将数组视为具有数字属性的对象,那么间距并没有什么问题。如果没有人能给出示例,说明具有间距的数组的好处大于其明显的缺点,那么我的问题就是回答理论背景和给定示例。你能说出一个以这种方式使用数组(作为稀疏数组)的js库吗?那会有帮助的!不是特别的,但我会注意到稀疏数组包含在和中。你看,在库中调用稀疏数组会很奇怪,就像在Python库中说“这是一个列表理解”——这只是语言的一个特性。如果它被使用了,它就被当作理所当然的事情使用。