代码之家  ›  专栏  ›  技术社区  ›  Munerz

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

  •  0
  • Munerz  · 技术社区  · 6 年前

    因此,我将学习一些有关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 回复  |  直到 6 年前
        1
  •  2
  •   T.J. Crowder    6 年前

    就是这样:

    1. 评价 obj[letter] (关于这一部分的更多信息,请参阅 this question's answers ):
      • 评价 letter 获取其当前值(例如, "a" )
      • 评价 obj 获取其当前值(对象)
      • 获取名为 “a” (例如)在物体上;如果该属性不存在,则其结果将是值 undefined
    2. 分支到 if 如果步骤1中的值为 真实的

    A. 真实的 价值是指任何不存在的价值 法尔西 .虚假的价值观是 未定义 , null , 0 , "" , NaN ,当然, false .

    基本上,这些代码所做的就是看看 obj 已经有了字母的属性,如果有,则增加其值;如果不是,则将其值设置为1。

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

    如果你知道这张支票很有价值,那么你就知道这张支票没有价值。