Javascript 为什么变量声明在这里被认为是多余的

Javascript 为什么变量声明在这里被认为是多余的,javascript,node.js,webstorm,jetbrains-ide,Javascript,Node.js,Webstorm,Jetbrains Ide,我有这个方法: getRandomKey(){ const r = Math.floor(Math.random()*this.lookup.size); let i = 0, k = null; for(k of this.lookup.keys()){ if(i === r) { break; } i++; } return k; } 我的IDE(Webstorm)说: 我以前见过类似的

我有这个方法:

  getRandomKey(){
    const r = Math.floor(Math.random()*this.lookup.size);
    let i = 0, k = null;
    for(k of this.lookup.keys()){
      if(i === r) {
        break;
      }
      i++;
    }

    return k;
  }
我的IDE(Webstorm)说:


我以前见过类似的事情,我非常确定你需要声明变量k,否则它将是全局的,我在这里缺少什么?

这是因为你将
k
设置为
null
是冗余的,替换
k=null带有
k它是冗余的原因是,在将值更改为其他值之前,您没有对k执行任何操作。这意味着您可以将k设置为任何值,只要您在实际使用它之前(无条件)更改它,您就会看到此调试消息

i、 e.在WebStorm中:

let i = 0, k = null;
for(k of this.lookup.keys()){
      if(i === r) {
        break;
      }
      i++;
    }
给出:

变量初始值设定项是冗余的

但是,

let i = 0, k;
for(k of this.lookup.keys()){
      if(i === r) {
        break;
      }
      i++;
    }

一切正常。

您需要声明它以避免隐式全局,但不需要初始化它(不需要为其赋值)

我想您的IDE已经很好地分析了您的代码,知道
this.lookup.keys()
至少有一个元素,因此
k
将永远不会保持
null
,并且一开始分配
null
是没有意义的;虽然我不认为这是有问题的(如果
this.lookup
将来被修改为空,并且您希望此函数在这种情况下返回
null
,而不是
未定义的
,该怎么办


您的IDE也可能认为任何赋值为
null
的变量声明语句都是多余的,因为它不区分
null
undefined
。但这完全是IDE中的一个错误。

我想知道-如果映射中有零个键,它真的是多余的吗?如果没有键,会吗k不是最终被未定义而不是null吗?我想知道-如果地图中有零个键,这真的是多余的吗?如果没有键,k不是最终被未定义而不是null吗?@AlexanderMills是的,这就是第二段所说的(重读时强调“至少一个元素”)我认为这取决于它给出此警告的其他场景。如果它在每次您执行类似于
让x=null;
的操作时都执行此操作,则无论您在何处执行此操作,我都会说这是一个错误。如果它仅在这一点上,它可能只是在进行高级分析,以确定
此。查找
不是空的。在任何情况下,我的advice只是禁止并忽略该警告的这个实例。@AlexanderMills,原因是在this.lookup.keys()的
k之前没有使用该变量
IDE向前看,发现它将被分配给其他对象,并且从不使用空值。您可以分配它
1
或其他任何对象,如果在您将其设置为其他对象之前未使用它,它将向您显示此调试消息。@Corykliser如何知道它被分配给其他对象?如果
this.lookup.keys()
为空循环不运行,
k
从未分配新值,第34行的
return k
返回
null
。这与返回
undefined
不同。在没有该警告的情况下实现此功能的另一种方法是使用
for(this.lookup.keys()的常量k){if(i==r){return k;}i++;}return null;