此函数将字符串中所有字符的数量计算为字符串。我不完全理解这里的if语句及其工作原理。
function getFrequency(string) {
var freq = {};
for (var i=0; i<string.length;i++) {
var character = string[i];
if (freq[character]) {
freq[character]++;
} else {
freq[character] = 1;
}
}
return freq;
};
我认为freq[character]
是对象的属性,例如A
B
它如何与if(freq[character])
一起使用freq[character]++
的增量如何工作? ?
我已经做了这样的测试,试着去理解它。
var v = {};
v.h = 3;
v["h"]++;
v["h"] = v["h"] + 1;
v.h++;
v.h = v.h + 2;
console.log(v);
console.log(v["h"]);
我想我可以猜测if语句有效,如果属性存在但我认为JS有一个对象属性调用.hasOwnProperty
不应该使用它吗?
至于增量,我的测试,它的工作原理,但我只是没有理由。
有人可以帮我详细解释一下吗? 提前致谢
答案 0 :(得分:4)
在javascript中,对象是关联数组。反之亦然。这两个概念没有区别。
因此将此变量定义为空对象:
var freq = {};
...实际上是在没有添加键的情况下创建一个关联数组(如字典或地图)。
继续,让我们采用像eek
这样的输入字符串。此处的代码将查看第一个字母,并将freq[character]
视为与freq['e']
相同,这与freq.e
相同。
在此代码中,freq
对象中任何字母的初始值为 undefined
。因此,初始if()
检查第一个&#34; e&#34;在我们的字符串中看起来像这样:
if(undefined)
Javascript具有&#34; truthy&#34;的概念。和&#34; falsy&#34;值; anything in javascript can be evaluated as a boolean,并且(在大多数情况下)实现了明智的结果。查看undefined
,Javascript只会将此值视为假值,落入else
块,因此执行此代码:
freq[character] = 1;
如前所述,这与freq.e = 1;
现在当循环继续到下一个字母(也是&#34; e&#34;)时,javascript将最终评估表达式if (1)
。 Javascript将此和所有其他非零数字视为&#34; truthy&#34;,所以这次将执行以下行:
freq[character]++;
同样,这与freq.e++
相同,其中freq.e
的值为&#34; 1&#34;现在可以增加到&#34; 2&#34;。
又一次循环播放最后一封信&#34; k&#34;。这次我们得到freq.k
,这仍然是未定义的。未定义是假的,因此控件属于else
块,freq.k
设置为&#34; 1&#34;。
现在你可以看到我们如何在字符串中找到它们时开始增加数组中的字母,即使看起来你从未在一开始就定义过一个数组,也从未将任何值设置为&#以外的任何值。 34; undefined&#34;,并且从未有过要检查的真实布尔值。
答案 1 :(得分:3)
if (freq[character])
检查值是否为“真实”。也就是说,它不是false
,null
,undefined
或0
。我们第一次遇到任何字符时,该值将为undefined
,因为对象文字是空的,因此“truthy”检查将失败,控件将落入else
块。
所以当我们第一次看到一个特定的字母时,将值设置为1(现在是“真正的”)。
该信件的任何后续遭遇只会增加该值,这相当于说freq[character] = freq[character] + 1;
。增量语法只是一种简写。
答案 2 :(得分:2)
if (freq[character])
检查对象freq
是否有一个属性,其值为character
作为名称。此表达式的结果将计算为true
或false
。
可以更明确地说明,因为以下非详尽说明:
if (freq[character] == null)
或
if (typeof freq[character] === 'undefined')
危险在评估对象是undefined
还是null
时不显式,是否实际设置为评估为true或false的其他类型(0
,1
,'0'
,true
,false
)。