【问题标题】:ESLint says array never modified even though elements are pushed into arrayESLint 说即使元素被推入数组,数组也不会被修改
【发布时间】:2016-04-19 11:36:47
【问题描述】:

我正在转换一些现有代码以遵循 ECMA 脚本,并且我正在使用 ESLint 来遵循编码标准。我有以下 ecmascript 方法

static getArrayOfIndices(text, char) {
    let resultArray = [];
    let index = text.indexOf(char);
    const lastIndex = text.lastIndexOf(char);
    while (index <= lastIndex && index !== -1) {
      resultArray.push(index);
      if (index < lastIndex) {
        index = text.substr(index + 1).indexOf(char) + index + 1;
      } else {
        index = lastIndex + 1999; // some random addition to fail test condition on next iteration
      }
    }
    return resultArray;
  }

对于resultArray的声明,ESLint抛出错误

ESLint: `resultArray` is never modified, use `const`instead. (prefer-const)

但是既然元素被压入数组,它不是被修改了吗?

【问题讨论】:

  • 但它仍然是同一个数组对象,所以指向该对象的指针是一个常量。
  • 啊!即使对象的内容可能会改变,指向该对象的引用/指针保持不变,因此最好使用 const。如果引用正在更改,例如resultArray = someOtherArray,然后使用 let 就可以了。明白了!

标签: javascript arrays ecmascript-6 eslint


【解决方案1】:

要了解此错误,您必须了解const 声明的变量包含对值的只读引用。但这并不意味着它所持有的价值是不可变的[mdn article]

由于您只是更改变量的成员,而不是对绑定执行重新分配,因此 es-lint 的 prefer-const 规则会警告您可以使用 const 声明的变量而不是 let 声明的变量.

【讨论】:

  • 谢谢..!很有帮助
  • 我不知道const 表示该引用是只读的,但它指向的实体是可变的。这是 JS 的特性还是其他主要编程语言也为const 共享这个概念?如果您不知道const 的实现细节,我可以看到它很容易被误解。真的很有趣,你读了这篇文章就很有意义。
  • @10110 这在几种主要的编程语言中很常见。例如,Java 中的 final 变量、Kotlin 中的 val 和 C# 中的 readonly 以相同的方式工作。其他语言如 PHP 和 Go 只允许您在 const 变量中具有某些不可变类型,如字符串、整数等,因此该概念与这些无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2013-07-05
  • 2019-08-11
  • 2015-03-30
  • 2018-04-01
相关资源
最近更新 更多