深刻理解:数组索引工作方式背后的基本逻辑是什么?

时间:2015-04-29 11:27:09

标签: javascript arrays indexing string-length

我对此问题的动机

对我来说,编程的快感在于深刻理解给定语言背后的逻辑能够让你“只是想出来”#34;使用那个逻辑。因此,当我偶然发现一些似乎错过这种逻辑的东西时,它会让我感到烦恼。

索引如何运作

这是我学习使用数组索引的原因:

var fruit = ["Apple", "Orange", "Kiwi"]

fruit.length = 3 // returns the length of the fruit array

var rotten = fruit[2] //assigns the value "Kiwi" to the variable "rotten"

fruit[2] = "Melon" //changes the 3rd object in the array fruit from "Kiwi" to "Melon"
fruit[fruit.length] = "Melon" //adds a new object to the array fruit after "Kiwi"

令我困扰的是逻辑

所以我刚用.length来获取我的水果数组长度为3的信息。接下来,我想使用var rotten = fruit[]访问第三个对象。我的逻辑告诉我,我应该使用var rotten = fruit[3]来做到这一点。但是返回undefined因为对象被索引为0,1,2。

同样我的想法是使用以下代码将对象添加到数组中:fruit[fruit.length + 1] = "Melon"因为我知道.length方法返回"最后一个对象的数量&# 34;在数组中。这当然不是实际情况,因为当考虑索引为0,1,2时,实际上这是2。

我的问题

有没有更深层的逻辑背后没有使用1,2,3而不是0,1,2索引数组,从而使我 - 在我看来 - 更直观地理解和使用Javascript或者这只是你应该做的事情学习我的心并接受而不寻求任何更深层次的推理?

1 个答案:

答案 0 :(得分:1)

在Fortran系列语言中,正如您所建议的那样,数组从1开始编制索引,因为这是标准的数学实践。在Algol-60 / PASCAL系列语言中,程序员选择起始索引 - 它可以是0,1或其他任何东西。在BCPL和C系列语言中,以及在大多数现代语言中(明显不包括Julia),数组索引从0开始。

多年来,人们发现单一约定很方便 - 当不同程序员编写的代码组合在一起时,PASCAL样式的索引会让人感到困惑,最好选择一个起始索引并坚持下去。

0和1之间的实际选择是相当随意的,但是许多wise people同意从0开始会使一些操作更简单,更不容易出错。比较例如以下两种数组交错的实现,基于0:

if(i % 2 == 0)
    a[i / 2] = 42;
else
    b[(i - 1) / 2] = 42;

和1-based:

if(i % 2 == 1)
    a[(i + 1) / 2] = 42;
else
    b[i / 2] = 42;