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;