当计算对象中字母的数量时,为什么我需要在增加对象之前测试对象是否存在属性?

问题描述 投票:0回答:3

[我看过一个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])吗?

node.js
3个回答
1
投票

obj对象开始为空。尝试访问它的任何属性都将返回undefined,如果尝试在++上使用undefined,则会得到NaN(不是数字),这不是您想要的:

const obj = {};
obj.foo++;
console.log(obj.foo);

要解决此问题,请在递增之前先检查该属性是否存在,如果不存在,请将其设置为00可递增; undefined不是。

const obj = {};
if (!obj.foo) {
  obj.foo = 0;
}
obj.foo++;
console.log(obj.foo);

您问题中的代码执行相同的操作,不同之处在于它遍历charwordInput字符串的字符)。如果尚未将字符作为对象的属性放置,则必须在递增之前设置它,否则生成的对象将包含无用的NaN值:

const wordInput = 'foo bar';

const obj = {};
for (let i = 0; i < wordInput.length; i++) {
  const char = wordInput[i];
  obj[char]++;
}
console.log(obj);

0
投票

在循环的第一轮中

i = 0 
-----------
char = 'h'
obj = {}
obj[char] ==> obj['h'] ==> undefined 

因此,如果您尝试这样做obj[char]++ ==> obj['h']++,因为值为undefined会引发错误。而是先使用if语句将其初始化为0,然后将其递增。


0
投票

if语句用于字符的第一个条目。在“ a”出现之前,obj中没有名为“ a”的属性。因此obj [char]定义了一个属性并将其值设置为0。在此之前,没有属性,因此未定义。您不能将运算符应用于undefined。

这是第一个字母在'hello'中时obj的样子

在if语句之前:

obj = {};

so obj ['h'] =未定义;

它进入if语句,然后:

obj = { 'h' : 0 }
© www.soinside.com 2019 - 2024. All rights reserved.