[我看过一个youtube视频,展示了如何使用Javascript计算每个字母的出现次数,例如,当输入为"hello"
时,该函数将返回
{h:1 e:1 l:2 o:1}
喜欢这个:
const obj = {};
for (let i = 0; i < wordInput.length; i++) {
const char = wordInput[i];
if (!obj[char]) {
obj[char] = 0;
}
obj[char]++;
}
为什么我们需要if语句?他说过类似“其中一些未定义”之类的内容,但是我不太确定这意味着什么,您能解释一下为什么我们需要if (!obj[char])
吗?
obj
对象开始为空。尝试访问它的任何属性都将返回undefined
,如果尝试在++
上使用undefined
,则会得到NaN
(不是数字),这不是您想要的:
const obj = {};
obj.foo++;
console.log(obj.foo);
要解决此问题,请在递增之前先检查该属性是否存在,如果不存在,请将其设置为0
。 0
可递增; undefined
不是。
const obj = {};
if (!obj.foo) {
obj.foo = 0;
}
obj.foo++;
console.log(obj.foo);
您问题中的代码执行相同的操作,不同之处在于它遍历char
(wordInput
字符串的字符)。如果尚未将字符作为对象的属性放置,则必须在递增之前设置它,否则生成的对象将包含无用的NaN
值:
const wordInput = 'foo bar';
const obj = {};
for (let i = 0; i < wordInput.length; i++) {
const char = wordInput[i];
obj[char]++;
}
console.log(obj);
在循环的第一轮中
i = 0
-----------
char = 'h'
obj = {}
obj[char] ==> obj['h'] ==> undefined
因此,如果您尝试这样做obj[char]++ ==> obj['h']++
,因为值为undefined
会引发错误。而是先使用if
语句将其初始化为0,然后将其递增。
if语句用于字符的第一个条目。在“ a”出现之前,obj中没有名为“ a”的属性。因此obj [char]定义了一个属性并将其值设置为0。在此之前,没有属性,因此未定义。您不能将运算符应用于undefined。
这是第一个字母在'hello'中时obj的样子
在if语句之前:
obj = {};
so obj ['h'] =未定义;
它进入if语句,然后:
obj = { 'h' : 0 }