JavaScript中frequencyCounter[iteration]为何同时作为键与值?
解释
frequencyCounter1[iteration] = (frequencyCounter1[iteration] || 0) + 1这行代码 这行代码的核心作用是统计数组中每个元素的出现次数,用对象作为“频率计数器”。你疑惑的左右两侧都用frequencyCounter1[iteration]的问题,本质是JavaScript中对象属性访问和赋值的逻辑是分开执行的,拆解来看就清晰了:
1. 左侧:给对象的键赋值
frequencyCounter1[iteration]里的iteration是当前遍历到的数组元素,它会被作为对象的键,这部分的作用是把右侧计算出的结果,赋值给这个键对应的位置,也就是更新该元素的出现次数。
2. 右侧:计算当前元素的最新出现次数
右侧的(frequencyCounter1[iteration] || 0) + 1分两步执行:
- 第一步:
frequencyCounter1[iteration]尝试读取对象中iteration这个键的值。如果是第一次遍历这个元素,对象里还没有这个键,会返回undefined(JavaScript中访问不存在的对象属性默认返回undefined)。 - 第二步:利用JavaScript逻辑或
||的短路求值特性:如果左边是假值(比如undefined、null这类),就直接返回右边的值;如果左边是真值(比如已经统计过的次数1、2),就返回左边的值。所以第一次遇到元素时,undefined || 0会得到0,之后遇到相同元素时,会直接取当前的次数值。 - 最后加1,得到当前元素的最新出现次数。
举个实际例子
比如遍历数组[2,2,2]:
- 第一次遍历2:
frequencyCounter1[2]是undefined,undefined || 0得到0,加1后是1,赋值给frequencyCounter1[2],对象变成{2: 1}。 - 第二次遍历2:
frequencyCounter1[2]是1(真值),1 || 0得到1,加1后是2,赋值后对象变成{2: 2}。 - 第三次遍历2:同理,得到3,对象最终是
{2: 3}。
等价的冗余写法
这行代码其实是把下面的逻辑压缩成了一行:
if (frequencyCounter1[iteration]) { // 元素已存在,次数加1 frequencyCounter1[iteration] += 1; } else { // 元素第一次出现,初始化为1 frequencyCounter1[iteration] = 1; }
内容的提问来源于stack exchange,提问作者Akhror Khamidov
相关产品推荐
相关产品推荐

