为啥我不能在使用 Javascript 的 if 语句中重新分配这个变量? [复制]

Posted

技术标签:

【中文标题】为啥我不能在使用 Javascript 的 if 语句中重新分配这个变量? [复制]【英文标题】:Why can't I reassign this variable inside an if statement using Javascript? [duplicate]为什么我不能在使用 Javascript 的 if 语句中重新分配这个变量? [复制] 【发布时间】:2021-12-10 09:20:48 【问题描述】:

我遇到了一些我认为与范围相关的奇怪行为,但我无法解释为什么会发生这种情况。

所以这是有问题的代码。我正在尝试对一些单词进行 Camel Case 并区分由破折号和下划线分隔的文本。忽略算法还不完全正确的事实,这不是重点。这是我注意到问题的阶段。

function toCamelCase(str)
    let isDash = false
    for (let char in str) 
      if (char === "-") 
        isDash = true
      
    
    if (isDash) 
      return str.split("-").map(word => word[0].toUpperCase() + word.slice(1, word.length + 1)).join("")
     else 
      return str.split("_").map(word => word[0].toUpperCase() + word.slice(1, word.length + 1)).join("")
    
  

let result = "why-false"
console.log(toCamelCase(result))

所以 isDash 确定文本包含哪种类型的分隔符。我显然可以使用箭头函数而不是这种方法,它会完美地工作。像这样的:

let isDash = () => 
for (let char in str) 
  if (char === "-") 
    return true
  

但我不明白为什么前面的例子不能正常工作。我已经阅读了范围,如果它是在更高级别定义的,应该可以重新分配给该变量。即使我在函数之外定义了 isDash,它仍然不起作用。它的值始终保持初始值:false。为什么 if 语句不将其值更改为 true?

let x = [1, 4, 5, 7]
let txt = 0
let working = "no"

for (let i in x) 
  txt += x[i]
  if (txt > 4) 
    working = "yes"
  


console.log(working)

如您所见,如果我写一些类似的东西来演示是否可以在嵌套的 if 语句中使用该变量,它工作正常并且工作将记录是。我在这里想念什么?我真的很感激一些帮助,这对我来说真的是一个死胡同,如果我自己能弄清楚,我就不会寻求帮助。非常感谢任何可以向我解释这些东西的人!

【问题讨论】:

FWIW,在未来,首先要做的是检查您的假设:您是否已登录或使用调试器来实际检查 char 中的内容?这应该始终是第一步。 感谢您的建议!我现在几乎是个菜鸟,所以我不知道如何使用调试器,但我今天会看一些教程并了解它的一切。 【参考方案1】:

这里的问题是你的 for 循环:

    for (let char in str) 
      if (char === "-") 
        isDash = true
      
    

for-in 循环遍历索引或键,而不是值(您可以通过在循环中执行 console.log(char); 来测试它)。相反,请使用 for-of 循​​环。

【讨论】:

感谢您的回答!但是为什么在遍历数组时 for-in 循环会起作用?正如您在我的上一个示例中看到的那样,它可以正常工作。据我了解,字符串也是一种数组,所以我的困惑源于它在数组而不是字符串上起作用的事实..【参考方案2】:

问题在于您使用的是 for...in 语句,该语句循环遍历对象的可枚举属性名称。

for (let char in str) 
      if (char === "-") 
        isDash = true
      
    

如果您不打算在块内重新分配变量,您可以使用 for...of 语句迭代字符串并使用 const。

这边:

for (const char of str) 
  if (char === "-") 
    isDash = true
  

【讨论】:

非常感谢!它按现在应该的方式工作。直到现在我才知道 for-of 循​​环,而且上一个示例中的数组而不是字符串(一种数组)的 for-in 循环让我感到困惑。 只是迭代的值不同而已。 for...of 返回一个包含值的列表,而 for...in 将产生一个键列表。例如: let string = 'String' for (const char in string) console.log(char); // => "0", "1", "2","3", "4", "5" for (const char of string) console.log(char); // => "S","t","r","i","n","g" 好的,这让我明白了很多。感谢您的详细解释。我现在完全意识到我的错误是什么!【参考方案3】:

我很确定这是因为您使用了“let”而不是“var”。 (老实说,在这篇文章之前我没有看到它使用过......)。

请看这篇文章: https://www.google.com/amp/s/www.geeksforgeeks.org/difference-between-var-and-let-in-javascript/amp/

如果这能解决您的问题,请进一步阅读两者之间的差异。

我个人总是只使用 var 。

【讨论】:

不是,建议在几乎所有情况下都使用let/const 而不是var(这种情况已经有一段时间了)。 一般我会说只有当你对答案有信心时才尝试发布答案,否则这可能会出现在评论中。在最初的问题中,范围界定是一个误诊。 我的立场是正确的

以上是关于为啥我不能在使用 Javascript 的 if 语句中重新分配这个变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制]

为啥我不能使用正则表达式来评估 if...else 语句 [重复]

为啥我不能在 IF-Else 中声明 char 数组?

为啥我的Visual Studio 2010不能显示错误(是输入的错误哦),,,但生成解决方案就有错误了..

为啥在 JavaScript 的 IF 语句中允许重新声明变量

为啥我不能在 if 标记内嵌套块标记?