问题描述
通读O'Reilly的JS权威指南,并发现以下代码块:
let freq = {};
for (let item of "alabama") {
if (freq[item]) {
freq[item]++;
} else {
freq[item] = 1;
}
}
只想了解一些语法和含义:
- 将一个空对象分配给“ freq”变量
- 在给定字符串上运行for / of循环
- 如果语句检查freq [item]是否返回true ..我得到了那部分,但是什么会触发该真实值?
- 那么,如何触发一个伪造的值来产生一个1值?
提前谢谢!
解决方法
首先,请记住,在使用for..of
遍历字符串时,为每个循环声明的项(您已将其命名为item
)是字符串的每个字符。
由于对象开始为空,因此freq[item]
最初将为undefined
。例如,在第一次迭代中,{}['a']
是undefined
,这是错误的,因此输入了else
:
freq['a'] = 1;
在随后的迭代中,当找到字符a
时,对象上将存在a
属性 ,因此输入了if
,将其递增属性值:
freq['a']++;
,
第一次在对象中找不到字母时,它将返回未定义的
1) a
freq['a'] will be undefined
therefore the code will set a 1 to it
freq['a'] = 1
2) l will go through the same steps as #1
3) a
freq['a'] will be 1
so it's truthy therfore we add 1 to it
freg['a'] ++; which will make it 2
然后,您可以按照相同的方式找出其余部分
,在javascript中以下为假
"",false,undefined,null
..
在您的情况下,freq是一个空对象
freq ={}
在循环的第一次迭代中
item = 'a'
freq[item]
将不确定
如果freq[item]
将是false
在其他freq[item] = 1
中,即freq={a:1}
第二次迭代freq={a:1,l:1}
的方法相同
第三次迭代
item = 'a'
freq[item]
将是1
如果freq[item]
为true,并递增freq={a:2,l:1}