我在网上课程中遇到了一个问题:
编写一个称为vowelCount的函数,该函数接受一个字符串并返回一个对象,该对象的键为元音,而值则为元音在字符串中出现的次数。此函数应区分大小写,因此小写字母和大写字母都应计数
例子: vowelCount('Elie')// {e:2,i:1};
来自讲师的解决方案是这样的:
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;
}
}
});
return obj;
}
我理解解决方案,直到第二个“ if”语句。我知道第一个“ if”语句是要检查输入字符串中的“字母”是否属于“元音”。然后在第二个“ if”中,检查“字母”是否在上面创建的空“ obj”对象中,但是在那一行,在将“ letter”添加到其中之前,“ obj”为空,那么什么是同样,为什么要向对象添加这个新的“字母”需要增量,我尝试了没有增量的代码,并且对象仍然为空。
It's checking if you've ever seen the letter before in the loop. If you've never written to
obj[letter]
, then when you doobj[letter]
, you get back the valueundefined
, which is falsy (treated asfalse
by things like anif
).if(obj[letter])
is checking for a truthy value (a value that isn't falsy) so that it adds to the number already stored atobj[letter]
if it's there (obj[letter]++
). But when it sees a falsy value likeundefined
, it takes theelse
branch and setsobj[letter]
to1
because the code knows thatletter
hasn't been seen before.