Может кто-нибудь объяснить восклицательный знак? - PullRequest
3 голосов
/ 27 апреля 2020
    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]

Мне трудно понять, как эти символы сравниваются с другими символами, поскольку в нем четко указано [в настоящее время я]. Если бы кто-то мог привести гораздо более простой пример. Я попытался отладить его, но также не смог понять.

Ответы [ 2 ]

5 голосов
/ 27 апреля 2020

! инвертирует правдивость выражения. Поскольку 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 голос
/ 27 апреля 2020

Вы можете выразить выражение на две части:

  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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...