为啥我不能在使用 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 语句 [重复]
为啥我的Visual Studio 2010不能显示错误(是输入的错误哦),,,但生成解决方案就有错误了..