理解这个语法 if(obj[x])

Understanding this syntax if(obj[x])

所以我正在学习 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[letter].

后面的语法

如有任何启发,我们将不胜感激。

就是这样做的:

  1. 评估 obj[letter](更多内容请见 this question's answers):
    • 计算 letter 以获得其当前值(例如,"a"
    • 正在计算 obj 以获取其当前值(对象)
    • 获取对象上名为 "a"(例如)的 属性 的值;如果 属性 不存在,则结果将是值 undefined
  2. 如果步骤 1 的值为 truthy
  3. ,则分支到 if

真实 值是任何非虚假 的值。虚假值是 undefinednull0""NaN,当然还有 false.

基本上,该代码所做的是查看 obj 是否已经有一个 属性 作为字母,如果是,则增加它的值;如果不是,它将其值设置为 1。

不过,不要过度概括该模式。它在这里起作用是因为 属性 的值永远不会是 0"" 或类似的值(存储的值从 1 开始并且只会增加)。但在其他情况下,如果您需要查看对象上是否存在 属性 但其值可能是这些虚假值之一,请使用 obj.hasOwnProperty(letter)(检查 属性 是否存在在对象本身,而不是它的原型上),letter in obj 如果你想检查对象和它的原型链,或者如果你想对 hasOwnProperty 被重新定义持怀疑态度,请使用 Object.prototype.hasOwnProperty.call(obj, letter)。 :-)

但是当您知道 属性 不存在或具有真实值时,此 "falsy" 检查非常有用。