关于JS对象键值赋值语法的疑问:字符频率统计函数解析
字符频率统计JS代码逻辑解析
我找到一个字符频率统计的JS解决方案,想理解其语法逻辑。问题要求:编写函数接收小写字母字符串,返回包含各字母出现次数的对象。解决方案代码如下:
function analyzeFrequencies(string) { const frequenciesObj = {}; for (let i of string) { frequenciesObj[i] = frequenciesObj[i] + 1 || 1; } return frequenciesObj; }我理解函数定义、空对象创建、for-of循环遍历字符串的部分,但完全不理解第四行代码:
frequenciesObj[i] = frequenciesObj[i] + 1 || 1。想知道它如何决定是设为1还是加1,以及如何为对象添加字母作为键?
一、如何为对象添加字母作为键?
在JavaScript中,你可以通过对象[键名]的语法给对象新增或修改属性。这里的i是for-of循环遍历到的每个小写字母:
- 第一次遇到某个字母时,
frequenciesObj里还没有以该字母为键的属性,frequenciesObj[i] = ...会自动给对象新增一个键为该字母的属性。 - 后续再遇到同一个字母时,就会直接修改这个已有键对应的值。
二、frequenciesObj[i] + 1 || 1的逻辑详解
这行代码核心利用了JavaScript逻辑或(||)的运算特性:逻辑或会返回第一个为「真值」的表达式结果;如果前面的表达式都是「假值」,才会返回最后一个表达式的结果。
分两种情况拆解:
第一次遍历到某个字母:
此时frequenciesObj[i]的值是undefined(对象里还没这个键),undefined + 1会得到NaN(非数字)。而NaN属于JavaScript里的「假值」,所以逻辑或运算会跳过前面的结果,直接取后面的1,最终frequenciesObj[i]被赋值为1,完成首次计数。重复遍历到同一个字母:
此时frequenciesObj[i]已经是之前存储的数字(比如1),数字 + 1会得到一个新的数字(比如2),数字属于「真值」,所以逻辑或运算会直接返回这个加1后的结果,最终frequenciesObj[i]被更新为新的计数(比如2),实现累加。
实际例子验证:
假设输入字符串是"aab":
- 第一次循环
i="a":frequenciesObj["a"]是undefined,undefined+1=NaN,NaN || 1结果为1 →frequenciesObj["a"] = 1 - 第二次循环
i="a":frequenciesObj["a"]是1,1+1=2,2 ||1结果为2 →frequenciesObj["a"] =2 - 第三次循环
i="b":frequenciesObj["b"]是undefined,undefined+1=NaN,NaN||1结果为1 →frequenciesObj["b"]=1
最终返回的对象就是{a: 2, b: 1}
内容的提问来源于stack exchange,提问作者user18206695
相关产品推荐
相关产品推荐

