你能解释一下字母[通过[i]] = (字母[通过[i]] || 0) + 1的工作原理吗?
此行将pass
的字母作为键添加到letters
对象中,并且它在值中出现的数量。
因此,例如,对于pass = "aabbc"
,您将letters
等于
{
"a":2,
"b":2,
"c":1
}
右边的运算符((letters[pass[i]] || 0) + 1
)可以分为两个:letters[pass[i]] || 0
检查letters
是否有值pass[i]
键,如果是这样,表达式将具有它的值,如果没有,那么我们将在||
后获得值 - 在本例中0
。对于此表达式的值,我们始终添加1
.
此外,我们可以将这一行转换为如下所示的内容:
if(letters[pass[i]]) {
letters[pass[i]]++;
} else {
letters[pass[i]] = 1;
}
关于值赋值中的||
运算符,您可以在此处阅读更多内容
让我们像JavaScript一样从内到外开始。
(letters[pass[i]] || 0) + 1
那:
- 以
pass[i]
开头,从pass
获取索引i
的字母(它似乎是一个字符串) - 然后尝试从
letters
(letters[pass[i]]
) 获取具有该名称的属性的值。它将获得一个放在它之前的数字,或者,如果该字母(尚)没有属性,它将获得值undefined
。 - 它将该值(数字或未定义)与
(the value) || 0
一起使用。||
运算符在 JavaScript 中工作得相当特别:它评估其左侧操作数,如果该值为真,则将该值作为其结果;否则,它将计算其右侧操作数,并将该值作为其结果。undefined
是一个虚假值,所以undefined || 0
是0
。这是为了处理第一次看到字母。 - 它增加了
1
从||
获得的结果。
基本上,这是在letters
上字母的属性值中添加一个,允许以前从未通过||
看到过该字母。
然后,它将结果存储回属性。