js对象和if语句。为什么这段代码没有使用else而使用else或者if语句没有?

时间:2018-02-20 17:04:14

标签: javascript if-statement

我是一个非常初学的JS“开发人员”(学生),我遇到了一个我无法解决的问题:为什么我的'helperHash'中重复字母的值在我不使用时会增加一个else语句以及为什么这个相同的值如果我使用else语句不会增加?我的代码按预期运行,但我在理解这个问题背后的逻辑时遇到了问题......

代码应返回一个数组,其中包含给定str中重复次数为1或更多的字母。

function nonUniqueLetters(str){
  var strToChars = str.split('');
  var finalArr = [];
  var helperHash = {};
  for (let i = 0; i < strToChars.length; i += 1){
    let char = str[i];
    if (!helperHash[char]){
      helperHash[char] = 0;
    }
    helperHash[char] += 1;  //HERE! why doesn't this work if inside an else?
  }
  for (var key in helperHash){
    if (helperHash[key] > 1){
      finalArr.push(key);
    }
  }
  return finalArr;
}

4 个答案:

答案 0 :(得分:2)

helperHash[char] ...

初始值为undefined!undefinedtrue,因此会将值设置为0

下次char具有相同的值时,helperHash[char]0!0 true,因此设置0的值(它已经存在,所以没有区别)。

不测试该值是否为false值,而是测试它是否未定义,或者它是否存在。

if (typeof helperHash[char] === "undefined")

if (char in helperHash) 

答案 1 :(得分:1)

原因是这个if (!helperHash[char]){以及如何在Javascript中将整数转换为布尔值。

您将哈希的每个成员初始化为0,等于布尔值false,因此,对于所有初始化为0的值,helperHash[char] === 0 === false因此!helperHash[char]为真,所以从不命中else。

答案 2 :(得分:1)

逻辑错误。

当前代码的工作原理:

if (!helperHash[char]){
    // Enters here only when helperHash[char] is not set (or 0, but it is never 0)
    helperHash[char] = 0;
}
// Always increment
helperHash[char] += 1;
// There is no 0 in helperHash at this point

为什么将helperHash[char] += 1放在else分支中不起作用:

if (!helperHash[char]){
    // Enters here only when helperHash[char] is not set or 0
    helperHash[char] = 0;
    // Still 0, will take this branch again on the next occurrence of char
} else {
   // Increment only if it was already 1 or more (this never happens)
   helperHash[char] += 1;
}
// Here helperHash contains only 0 for all keys

如何使其工作:

if (!helperHash[char]){
    // This is the first occurrence of char, let's count it
    helperHash[char] = 1;
} else {
    // This is a subsequent occurrence of char, let's count it too
    helperHash[char] += 1;
}
// There is no 0 in helperHash at this point

答案 3 :(得分:1)

您的if条件:

!helperHash[char]

始终评估为truehelperHash从未在其中包含“麻痹”的字符)。因此,else的{​​{1}}分支永远不会被击中。