在查找字符串中出现的字符频率时,这种语法的含义是什么?
var str = 'abcccdddd';
function maxCharCount(target) {
const chars = {};
let maxChar = '';
let maxValue = 1;
for (let char of target) {
chars[char] = chars[char] + 1 || 1; //what is the meaning of this line exactly in detail???
}
return chars;
}
console.log(maxCharCount(str));
完整代码和说明:
function maxCharCount(target) {
const chars = {};
let maxChar = '';
let maxValue = 1;
for (let char of target) {
chars[char] = chars[char] + 1 || 1;
}
return chars;
}
console.log(maxCharCount(str));
如果chars
是一个对象,代码将转到chars
中的属性,命名为char
等于。如果属性存在,则将以1为增量。如果不存在,则将创建该属性并将其设置为1。
函数本身所做的是它需要一串字符,并返回一个包含字符串中每个字符的字符数的对象 - 所以如果我们传递字符串hello
,输出应该是:
{
"h": 1,
"e": 1,
"l": 2,
"o": 1
}
chars[char] + 1 || 1
有两个方面:左和右。如果左边一个解析为假值,则整个表达式解析到右侧,如果左解析为真,则表达式解析到左侧。
也就是说,在一种情况下左侧只能是假的:当chars[char]
是undefined
时(当chars
不包含名为char
的属性时)。并且undefined + 1
给出NaN
,即不是数字,这是一个虚假值。
像这样的代码应该被认为是坏的,因为它使开发人员的意图不明显。相反,至少应该喜欢这样的东西:
chars[char] = chars[char] ? chars[char] + 1 : 1;
如果char在obj chars中,则它将为+ 1计数,否则它将向对象添加值为1的char。