Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个if语句是如何工作的?(Javascript)_Javascript_Object_Properties - Fatal编程技术网

这个if语句是如何工作的?(Javascript)

这个if语句是如何工作的?(Javascript),javascript,object,properties,Javascript,Object,Properties,此函数用于计算字符串中所有字符的个数。我不完全理解这里的if语句及其工作原理 function getFrequency(string) { var freq = {}; for (var i=0; i<string.length;i++) { var character = string[i]; if (freq[character]) { freq[character]++; } else {

此函数用于计算字符串中所有字符的个数。我不完全理解这里的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;
};
我想我可以猜测if语句是否有效,如果属性存在,但是我认为JS有一个对象属性调用
。hasOwnProperty
是否应该使用它? 至于增量,根据我的测试,它是有效的,但我不明白原因

有人能帮我详细说明一下吗? 提前感谢javascript中的对象是关联数组。反之亦然。这两个概念没有区别

因此,将此变量定义为空对象:

var freq = {};
。。。实际上正在创建一个关联数组(如字典或地图),但尚未添加任何键

接下来,让我们使用一个输入字符串,如
eek
。这里的代码将查看第一个字母,并将
freq[character]
freq['e']
相同,这与
freq.e
相同

在此代码中,
freq
对象中任何字母的初始值都是
未定义的
。因此,初始的
if()
检查字符串中的第一个“e”实际上如下所示:

if(未定义)

Javascript具有“truthy”和“falsy”值的概念,而且(在大多数情况下)取得了合理的结果。查看
undefined
,Javascript将简单地将其视为一个虚假的值,落到
else
块,因此执行此代码:

freq[character] = 1;
如前所述,这与
freq.e=1相同

现在,当循环继续到下一个字母(也是一个“e”)时,javascript将最终计算表达式
if(1)
。Javascript将此数字和所有其他非零数字视为“truthy”,因此这次将执行以下行:

freq[character]++;
同样,这与
freq.e++
相同,其中
freq.e
的值为“1”,现在可以增加到“2”

最后一个字母“k”再循环一次。这次我们得到了
freq.k
,它仍然没有定义。Undefined为falsy,因此控制权落入
else
块,并且
freq.k
设置为“1”

现在,您可以看到,当您在字符串中找到字母时,我们如何开始递增数组中的字母,即使看起来您一开始从未定义过数组,从未将任何值设置为“未定义”以外的任何值,也从未检查过实布尔值。

if(freq[character])
检查对象
freq
是否具有值为
character
作为名称的属性。此表达式的结果计算为
true
false

可以更明确地说明,如下所示:

if (freq[character] == null)

在评估对象是否未定义或
null
时不明确的危险是,如果对象实际设置为另一种类型,评估结果为真或假(
0
1
'0'
true
false

if(freq[character])
检查值是否为“truthy”。也就是说,它不是
false
null
undefined
0
。当我们第一次遇到任何字符时,值将是未定义的,因为对象文本是空的,所以“truthy”检查将失败,控制权将落在
else
块上

因此,当我们第一次看到一个特定的字母时,将值设置为1(现在是“truthy”)


任何后续遇到该字母的情况都会增加该值,这相当于说
freq[character]=freq[character]+1。增量语法只是一种简写。

看起来像是计算字符的出现次数
string='abbccdd'
=
freq=[1,2,3,2]
这计算字符串中每个字符(字母、数字等)的出现次数。if语句本质上是说“如果设置了freq对象的[character]值并且有一个值,那么向它添加一个值(这就是
++
所做的),否则将其设置为1”欢迎使用JavaScript!对于增量,您究竟不了解什么
foo++
foo=Number(foo)+1
@FelixKling的简写,也许我只是想得不清楚
freq.character
相当于
freq[“character”]
之后的属性名称是文本,而不是变量。因此,如果属性是一个数值,那么增量将像这样工作,因为JS就是这样的:希望你不介意编辑。如果您觉得他们做得太过分了,请随意回滚。哇,谢谢您提供的详细信息,但这只是引起了我对
的好奇心。hasOwnProperty
如果我们可以像检查
if(object[property])
一样检查它,而不是使用
if(object.hasOwnProperty['prop'])
.hasOwnProperty()
只返回一个布尔值。您可以使用它,但它更为详细。这与主题无关,但不知道是否可以不使用对象而像列表一样返回?几乎是一样的东西,但不是一个对象。你需要一个字典或地图,将特定的字母与该字母的计数关联起来。Javascript通过关联数组实现这一点,而关联数组又与对象完全相同。在javascript中,关联数组和对象只是以不同的方式在代码中表示内存中相同的底层结构
if (freq[character] == null)
if (typeof freq[character] === 'undefined')