为什么我需要.length在for循环中找到数组元素的等价关系?

时间:2018-08-04 12:27:22

标签: javascript arrays if-statement indexing

我正在处理的问题遍历数组,但是根据我在数组中的位置具有三种不同的行为: 1.最后一个元素:执行A; 2.倒数第二个元素:做B; 3.所有其他元素:C。

为了确定我的位置,我使用了if语句,并注意到当我仅使用索引[-1]和[-2]时,if语句的计算结果不符合预期。为什么?

for(let i = 0; i < arr.length; i++){
  if (arr[i] === arr[arr.length-1]){console.log(`last itme`)} // This one evaluates i to be equal to the last item in the array when i is length-1
  if (arr[i] === arr[-1]){console.log(`last itme`)} // This one *does not* evaluates i to be equal to the last item in the array when i is length-1
}

很抱歉,如果这是重复的内容-我做了搜索,找不到类似的东西。谢谢!

3 个答案:

答案 0 :(得分:1)

JS中的数组索引定义为

  

仅当P等于ToString(ToUint32(P))并且P不等于ToUint32(P)时,字符串属性名称2^32-1是数组索引。 / p>

(实际上是指[0; 2^32-1)范围内的整数)

因此像-1这样的负索引虽然有用,但根本不存在。

参考文献:

答案 1 :(得分:0)

因为数组索引从0开始。在JS中,像-1或-2这样的值不是有效的索引。

(也许您具有pythonic背景,因为这在python中意味着某些东西。)

答案 2 :(得分:0)

实际上,将if语句移出循环是有意义的,就像您当前的代码一样,使用类似以下数组的行为会很有趣:

 [1, 1, 1, 1]

,因为它将一直输入两个ifs。因此,您可以这样做:

 if(arr.length > 0) {
   const last = arr[arr.length - 1];
   //...
 }

 if(arr.length > 1) {
  const second = arr[arr.length - 2];
  //...
 }

 for(const rest of arr.slice(0, -2)) {
   //...
 }