有人能解释一下感叹号吗?

3
    const string = "Hello There";
    const chars ={};

for(let character of string){
  if(!chars[character]){
    chars[character] = 1;
  }else{
    chars[character]++;
  }
}
console.log(chars);

以下代码将打印出字符串中出现的唯一字母数。我知道感叹号代表“假”,但是我不理解在以下示例中它代表什么:
!chars[character]

我很难理解如何比较it字符与其他字符,因为它明确说明char [在当前i]。 如果有人能给出一个更简单的例子,那就好了。我试着调试它,但也无法理解。

1
感叹号表示“不”,例如 not chars['H'] => "H" 元素不存在于 chars 中。 - Mister Jojo
3
在第0到2次迭代中("H","e","l"),如果对象char没有"H",则条件为:if (!char[character]) {...--则开始一个:"char:{"H": 1}",然后在第二次迭代中变成了:"char:{"H": 1, "e": 1}",直到第四次迭代满足第二个条件:"else {..."当对象char"l"时,将添加到char["l"]的计数器中--所以在第四次迭代中它将是:"char: {"H":1, "e": 1, "l": 2};"。 - zer00ne
@zer00ne 你应该把它写成一个答案。 - Soner from The Ottoman Empire
1
@zer00ne 非常感谢您逐步解释。这对我非常有帮助。 现在我明白了,chars{}保留信息,以便检测是否有重复字符并执行else条件。 - Roma Kim
@snr-ReinstateMonica,CP先生已经给出了答案 - zer00ne
2个回答

6

!可以翻译为“非”,用于翻转表达式的真假值。由于chars最初是一个空对象,第一次迭代字符时,它不会存在于对象的属性中;它将是undefined。例如,对于H

chars[character]
// equivalent to
chars.H
// resolves to
undefined

// putting ! in front of it makes it truthy instead:
!undefined -> true

所以,if(!chars[character]){ 的意思是:如果该字符在对象中不存在,则执行以下代码块:
  chars[character] = 1;
} else {
  // The character has already been iterated over;
  // it exists on the object, and the value is a number
  // Increment that number:
  chars[character]++;
}

1
你可以将表达式分为两部分:
  1. chars[character] 返回未定义或字符串中的字符数作为数字
  2. !(逻辑非运算符)强制下一个值转换为布尔型,然后将其取反
因此有两种可能情况:
chars[character] // undefined
Boolean(chars[character]) // false
!chars[character] // true

chars[character] // 1
Boolean(chars[character]) // true (numbers other than 0 are coerced to true)
!chars[character] // false

在MDN上获取更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接