关于JavaScript vowelCount函数计数逻辑的技术咨询
解答你的vowelCount函数疑问
嘿,我来帮你把这两个点掰明白,其实都是对象属性计数的核心逻辑,咱们一步步拆解~
1. 第二个if判断的意义是什么?
你说得对,第一个if是用来筛选出元音字符的,那第二个if的作用就是区分“这个元音是第一次出现”还是“已经出现过”:
- 当第一次遇到某个元音时,初始为空的
obj里还没有这个键,所以obj[letter]的值是undefined(JS里访问对象不存在的属性会返回undefined),这时if(obj[letter])的判断结果是false,就会进入else分支,把这个元音的计数初始化为1。 - 当再次遇到同一个元音时,
obj里已经有这个键了(比如第一次遇到'e'后,obj['e'] = 1),这时if(obj[letter])的判断结果是true(因为1是真值),就会执行obj[letter]++,把计数加1,实现累计次数的效果。
拿你的示例vowelCount('Elie')来说:
字符串转小写后是'elie',遍历过程是:
- 第一个字符'e':
obj['e']不存在(undefined),执行obj['e'] = 1,此时obj是{e:1} - 字符'l':不是元音,跳过
- 字符'i':
obj['i']不存在,执行obj['i'] = 1,此时obj是{e:1, i:1} - 字符'e':
obj['e']已经是1(真值),执行obj['e']++,变成2,最终obj是{e:2, i:1}
2. 为什么需要自增操作?去掉自增后返回空是怎么回事?
自增操作的核心作用就是累计同一个元音的出现次数——如果没有它,每次遇到重复的元音时,我们没法更新已有的计数,只能一直停留在初始的1。
至于你说“去掉自增后返回对象为空”,大概率是你修改代码时不小心破坏了逻辑:
比如如果你把obj[letter]++;删掉,只保留else里的obj[letter] = 1;,那第一次遇到元音时会正常设置计数,但第二次遇到同一个元音时,因为if(obj[letter])为true,却没有对应的代码执行,所以这个元音的计数不会被更新,但对象里已经存在的属性还是会保留,不会是空的。
如果你是直接删掉整个if-else,只写if(vowels.indexOf(letter) !== -1) obj[letter]++;,那第一次遇到元音时,obj[letter]是undefined,undefined++会变成NaN,这时对象里会有这个键,但值是NaN,也不会是空对象。
最可能的情况是你修改时误删了else { obj[letter] = 1; }这段初始化逻辑,那不管遇到什么元音,都只会执行自增,但初始没有赋值,obj里根本不会添加任何属性,自然返回空对象啦~
内容的提问来源于stack exchange,提问作者wyfy
相关产品推荐
相关产品推荐

