如果(obj [x])理解这种语法

时间:2018-05-26 16:47:49

标签: javascript foreach indexof

所以我正在关注Udemy& amp;总的来说,他们一直很优秀,除非现在我有一个新的指导员,我现在并不是对这些职能的内部运作的描述。

当前示例是一个函数,用于计算所述字符串中元音的迭代次数。

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 [letter]后面的语法。

对此的任何启示都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

这样做:

  1. 评估obj[letter]this question's answers中有关此部分的更多信息):
    • 评估letter以获取其当前值(例如,"a"
    • 评估obj以获取其当前值(对象)
    • 获取对象上名为"a"的属性的值(例如);如果该属性不存在,则其结果为值undefined
  2. 如果步骤1中的值为 truthy
  3. ,则分支到if

    truthy 值是不是 falsy 的任何值。虚假值为undefinednull0""NaN,当然还有false

    基本上,该代码正在做的是查看obj是否已经具有该字母的属性,如果是,则递增其值;如果没有,它将其值设置为1。

    不要过多地概括这种模式。它在这里工作,因为属性的值永远不会是0""或类似的(存储的值从1开始,只会增加)。但在其他情况下,如果您需要查看对象上是否存在属性但其值可能是这些有价值的值之一,请使用obj.hasOwnProperty(letter)(以检查对象本身是否存在属性,而不是原型),letter in obj如果你想检查对象及其原型链,或者你想要重新定义hasOwnProperty的偏执,请使用Object.prototype.hasOwnProperty.call(obj, letter)。 : - )

    但是当您知道该物业不存在或具有真实价值时,这种“假”检查非常有用。