【问题标题】:variable changing it's value even if I haven't written a code to change it [closed]即使我没有编写代码来改变它,变量也会改变它的值[关闭]
【发布时间】:2021-07-25 04:46:58
【问题描述】:

function checkStrings(text, brokenLetters) {

  const textArr = text.split(' ');
  if (brokenLetters.length === 0) return textArr.length;
  const brokenSet = new Set(...brokenLetters.split(' '));
  let result = 0;
  let check = true;

  for (const el of textArr) { //element of array
    //     check = true;
    for (const ch of el) { //char of string(written as el)
      if (brokenSet.has(ch))
        check = false;
    }
    if (check) result++;
  }

  //should return 1, but it's 0 'cause check automatically becomes `false` after the last iteration.
  return result;
}

console.log(checkStrings('leet code', 'lt'));

在上面的代码中,如果我没有在第一个循环中添加行 check = truecheck 在最后一次迭代后自动将其值更改为“false”,而很明显应该将其更改为 @987654324 @ 仅当if 条件为真时。 有谁知道为什么会这样?

【问题讨论】:

  • check=false 曾经被执行过吗?
  • 不存在自动改变的东西...
  • 也许你注释掉了一个重要的行。>>//check = true;<<
  • 我认为您应该将集合定义更新为new Set([...brokenLetters.split(' ')]); 或只是new Set(brokenLetters.split(' ')); 通过控制台日志检查brokenSet 是否具有预期值。

标签: javascript string loops variables


【解决方案1】:

check 不会更改为 false。自上次执行以来,它仍然是 false

例如如果你运行checkStrings("a leet code", "lt"),它不会在第一次迭代后变为false,即单词"a",但在第二次迭代后将保持false直到结束。

因此,如果您运行checkStrings("a code", "lt"),它将永远不会更改为false

要解决此问题,您需要将第一个循环内的 let check = true; 移动到您当前注释掉的 // check = true; 所在的位置。

【讨论】:

  • 谢谢兄弟,我明白了
【解决方案2】:

你应该注意到Set 的使用,因为它的构造函数参数是一个可迭代对象。这意味着当你传递一个字符串时,它会被分解它的字符,从而在上述情况下产生brokenSet = {'l', 't'},这些字符出现在单词“leet”中。

在此处查看Set 构造函数的参数定义:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/Set#parameters

【讨论】:

  • 我知道这一点。我希望它像那样工作。我只是想知道为什么check 会更改为false,我知道,但非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2015-06-03
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2014-01-28
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多