Понимание этого синтаксиса if (obj [x]) - PullRequest
0 голосов
/ 26 мая 2018

Итак, я следую некоторым учебникам по Udemy, и в целом они были превосходны, за исключением того, что теперь для новой части есть новый инструктор, который не так описат внутреннюю работу функций.

Текущий пример - это функция, которая подсчитывает, сколько итераций гласных есть в указанной строке.

function vowelCount(str){
    var splitArr = str.toLowerCase().split("");
    var obj = {};
    var vowels = "aeiou";

    splitArr.forEach(function(letter){

        if(vowels.indexOf(letter) !== -1){
            if(obj[letter]){
                obj[letter]++;
            } else{
                obj[letter] = 1;
            }
        }
    });

}

vowelCount("abcdefghij")

Часть, на которую я лично поставлен, - if(obj[letter])

По-моему, переменная obj пуста, и что-либо внутри [] в этом случае является ссылкой на индекс, и я не понимаю, что проверяет оператор if, я также не совсем понимаю синтаксис, которыйследует из obj [письма].

Любое просвещение по этому вопросу будет высоко оценено.

1 Ответ

0 голосов
/ 26 мая 2018

Это делает это:

  1. Оценка obj[letter] (подробнее об этом ответы на этот вопрос ):
    • Оценка letter, чтобы получить еготекущее значение (например, "a")
    • Оценка obj для получения его текущего значения (объекта)
    • Получение значения свойства с именем "a" (например) впредмет;если свойство не существует, результатом будет значение undefined
  2. Разветвление в if, если значение из шага 1 равно truey

A truey значение - это любое значение, которое не falsy .Ложные значения: undefined, null, 0, "", NaN и, конечно, false.

В основном то, что делает этот код, видит, если objуже имеет свойство для письма и, если это так, увеличивает его значение;в противном случае он устанавливает его значение равным 1.

Однако не слишком обобщайте этот шаблон.Это работает здесь, потому что значение свойства никогда не будет 0 или "" или подобным (сохраняемые значения начинаются с 1 и только увеличиваются).Но в других ситуациях, если вам нужно проверить, существует ли свойство у объекта, но его значение может быть одним из этих ложных значений, используйте либо obj.hasOwnProperty(letter) (чтобы проверить, существует ли свойство на самом объекте, а не на его прототипе), letter in obj, если вы хотите проверить объект и его цепочку прототипов, или если вы хотите быть параноиком по поводу переопределения hasOwnProperty, используйте Object.prototype.hasOwnProperty.call(obj, letter).: -)

Но эта «ложная» проверка очень полезна, когда вы знаете, что свойства либо там не будет, либо оно имеет истинное значение.

...