You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用存储整数的变量访问数组元素时结果为undefined?

问题:数组下标使用变量时返回undefined?

我尝试编写了如下函数:

var uniqueInOrder = function(iterable){
    const someArray = []
    let count = 0

    for (const i of iterable) {
      if (i != someArray[count]) {
        console.log(someArray[count])
        someArray.push(i)
        count++
      } else {
        continue
      }
    }
    return someArray
  }

console.log(uniqueInOrder('AAAABBBCCDAABBB'))

问题描述:
当我使用someArray[1]时可以正常访问数组元素,但使用存储整数的变量count作为下标,即someArray[count]时,结果却为undefined。我是不是忽略了什么显而易见的问题?

提前感谢解答!

我曾编写单独的测试脚本:

const someArray = ['a', 2, 'c', 4]
let count = 3

console.log(someArray[count])

该脚本运行正常。

我无法理解为何在上述函数场景中采用相同方式会出现undefined的情况。


解答

问题出在count变量的初始值和使用逻辑上:

  • 初始时someArray是空数组,count设为0,此时someArray[count]即someArray[0]自然是undefined。
  • 每push一个元素后你就执行count++,这导致count的值始终等于当前someArray的长度。而数组的下标范围是0到length-1,所以someArray[count]永远指向数组的下一个未定义的位置,而非最后一个已添加的元素。

比如第一次循环后,someArray是['A'],count变成1,此时someArray[1]就是undefined;第二次循环遇到的还是A,和undefined比较会判定为不等,错误地再次pushA,完全违背了去重逻辑。

你可以直接通过数组长度来获取最后一个元素,无需额外维护count变量,修正后的代码如下:

var uniqueInOrder = function(iterable){
    const someArray = []
    for (const i of iterable) {
      // 数组为空时直接添加,否则和最后一个元素比较
      if (i !== someArray[someArray.length - 1]) {
        someArray.push(i)
      }
    }
    return someArray
  }

console.log(uniqueInOrder('AAAABBBCCDAABBB')) // 输出 ["A","B","C","D","A","B"]

如果一定要用count变量,只需把初始值改为-1,这样第一次循环时someArray[count]是undefined,push后count变为0,后续就能正确指向数组最后一个元素:

var uniqueInOrder = function(iterable){
    const someArray = []
    let count = -1

    for (const i of iterable) {
      if (i != someArray[count]) {
        someArray.push(i)
        count++
      }
    }
    return someArray
  }

至于你的测试脚本能正常运行,是因为测试中count的值等于数组最后一个元素的下标(数组长度4,下标最大为3),而函数中count始终等于数组长度,两者逻辑完全不同。


内容的提问来源于stack exchange,提问作者imanidiot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:35:50