为啥不能重新分配var?

Posted

技术标签:

【中文标题】为啥不能重新分配var?【英文标题】:why the var cannot be reassign?为什么不能重新分配var? 【发布时间】:2018-02-16 13:43:36 【问题描述】:

我调试了这个函数,发现var indexOfString找到一个索引后无法更新,为什么?

function occurrencesOfSubstring(fullString, substring)
    var countOfString = 0
    var indexOfString = 0
    while(true)
        indexOfString = fullString.indexOf(substring,indexOfString)
        if (indexOfString > 0)
            countOfString += 1
        else
            return countOfString
        
    

【问题讨论】:

需要明确的是,您并没有收到指出变量无法重新分配的错误消息,而是想知道为什么它没有改变? @Teemu 我应该放在哪里? @Teemu 不,这不是问题所在。 OP 并没有真正发布问题所在。 返回总是未定义,是吗? if (indexOfString > 0) 如果indexOfString 返回0 怎么办?如果您在运行时单步执行代码并检查变量,将更容易找到有缺陷的逻辑。 【参考方案1】:

谢谢你们,我知道问题出在哪里了。

function occurrencesOfSubstring(fullString, substring)
    var countOfString = 0
    var indexOfString = 0
    while(true)
        indexOfString = fullString.indexOf(substring,indexOfString + 1)
        if (indexOfString > 0)
            countOfString += 1
        else
            return countOfString
        
    

【讨论】:

【参考方案2】:

试试这个:

var indexOfString = -1;
...
    indexOfString = fullString.indexOf(substring,indexOfString + 1);

否则,每次执行循环时,您都会不断找到相同的索引。

另外,请记住索引是从零开始的,因此如果字符串的“第一个”字符开始匹配您的子字符串,您将得到 0 作为结果。因此,您可以将条件更改为:

    if (indexOfString >= 0)
        countOfString += 1
    else
        return countOfString
    

【讨论】:

以上是关于为啥不能重新分配var?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能将匿名方法分配给 var?

为啥 C++ 分配器中没有重新分配功能?

为啥不能为 Java 中的 var 关键字分配 lambda 表达式?

为啥链接到 Promise.resolve() 的 .then() 允许重新分配 const 声明?

为啥 spark 没有在多个节点上重新分配我的数据帧?

即使我将变量分配为 var,我也会收到“Val 无法重新签名错误”?