第一次这一行 console.log;正在打印未定义

分享于2023年06月29日 function hash html javascript jquery 问答
【问题标题】:for the first time this line console.log("alphabet--->" + alphabet); is printing undefined第一次这一行 console.log("alphabet--->" + alphabet);正在打印未定义
【发布时间】:2023-06-28 21:35:01
【问题描述】:
  • 我是 js 新手。
  • 我正在分析一个简单的代码。
  • 不确定它是如何工作的。
  • 第一次使用这一行 console.log("alphabet--->" + alphabet);正在打印未定义的计数[字母]--->未定义
  • 你能告诉我为什么它的打印未定义。
  • 第二次在这一行打印 3 console.log(counts[alphabet] + 1);
  • 但它应该从 1+1 开始打印两个。
  • 你们能否解释一下,以便我以后自己修复它。
  • 在下面提供我的代码更改。
var str = "aaabbccccddd";
var arr = str.split("");
var counts = {};
for (var i = 0; i < arr.length; i++) {
    var alphabet = arr[i];
    console.log("alphabet--->" + alphabet);
        console.log("counts[alphabet]--->" + counts[alphabet]);

    if (counts[alphabet]) 
        {
            counts[alphabet] = counts[alphabet] + 1;
            console.log("inside if--->");
            //console.log("inside if--->" + counts[alphabet] + 1);
            console.log(counts[alphabet] + 1);
        }
    else
    { 
        counts[alphabet] = 1;
        console.log("inside else--->");
        console.log(counts[alphabet]);

        //console.log("inside else--->" + counts[alphabet] + 1);
    }
    //counts[alphabet] = counts[alphabet] ? counts[alphabet] + 1 : 1;
}

console.log('a: ' + counts['a'] + '\n b: ' + counts['b'] + '\n c: ' + counts['c'] + '\n d: ' + counts['d'])

输出

alphabet--->a
  counts[alphabet]--->undefined
  inside else--->
  1
  alphabet--->a
  counts[alphabet]--->1
  inside if--->
  3
  alphabet--->a
  counts[alphabet]--->2
  inside if--->
  4
  alphabet--->b
  counts[alphabet]--->undefined
  inside else--->
  1
  alphabet--->b
  counts[alphabet]--->1
  inside if--->
  3
  alphabet--->c
  counts[alphabet]--->undefined
  inside else--->
  1
  alphabet--->c
  counts[alphabet]--->1
  inside if--->
  3
  alphabet--->c
  counts[alphabet]--->2
  inside if--->
  4
  alphabet--->c
  counts[alphabet]--->3
  inside if--->
  5
  alphabet--->d
  counts[alphabet]--->undefined
  inside else--->
  1
  alphabet--->d
  counts[alphabet]--->1
  inside if--->
  3
  alphabet--->d
  counts[alphabet]--->2
  inside if--->
  4
  a: 3
 b: 2
 c: 4
 d: 3

  • 在您的 console.log("counts[alphabet]--->" + counts[alphabet]) 中, alphabet 之前设置为 arr[i]; ,所以您实际上是在说 console.log("counts[alphabet]--->" + counts[arr[i]]) ,它在计数中还不存在,所以它是未定义的
  • @ᔕᖺᘎᕊ 嘿,谢谢您的回复...您能给 cmets 带来难以理解的内容吗...请

【解决方案1】:

你的代码很完美!它最终会为您提供正确的结果。 console.logs() 中的一个只是一个小错误。

让我们来看看到底发生了什么。

设置变量。

var str = "aaabbccccddd";
var arr = str.split("");
var counts = {};

循环 arr ,等于 ['a','a','a','b','b','c','c','c','c','d','d','d']

for (var i = 0; i < arr.length; i++) {

第一次进入循环。将 alphabet 设置为 arr[i] ,即 arr[0] ,即 'a'

var alphabet = arr[i];

counts 此时仍只是一个空对象 ( {} )。这意味着 counts[alphabet] counts['a'] 是' undefined '。在 JavaScript 中, if(undefined) if(false) 相同,所以我们跳转到 else 块。

if (counts[alphabet]) 

在 else 块中,我们将 counts[alphabet] (即 counts['a'] )设置为 1 。因此 counts 变为 {'a': 1}

counts[alphabet] = 1;

除了几个 console.log() s 之外,循环内没有其他事情可做。所以 i 0 变为 1 (因为 i++ )。 i < arr.length 1 < 12 仍然是 true 所以我们将再次遍历循环体。

for (var i = 0; i < arr.length; i++) {

第二次进入循环。将 alphabet 设置为 arr[i] ,即 arr[1] ,即 'a'

var alphabet = arr[i];

和以前一样, counts[alphabet] counts['a'] ,但现在 counts['a'] 有一个值。在最后一个循环结束时, counts['a'] 被设置为 1 。在 JavaScript 中, 0 以外的任何数字都是“真实的”。这次我们不会跳转到 else 块。我们将执行 if 块。

if (counts[alphabet]) 

我们增加 counts[alphabet] ,即 counts['a'] 。之前是 1 。现在是 2

counts[alphabet] = counts[alphabet] + 1;

现在我们来到给出意外输出的那一行。根据上述行, counts[alphabet] counts['a'] 现在是 2 。当然, 2 + 1 3 。此行将输出 3

console.log(counts[alphabet] + 1);

如果我理解您要执行的操作,则无需在此处添加 1。删除 + 1 ,您应该会得到预期的输出。

console.log(counts[alphabet]);

【讨论】:

  • 嘿,谢谢您的回复...您能给 cmets 带来难以理解的内容吗...请
  • 是的,我已经用更多细节重写了答案。让我知道这是否有帮助。
  • hey counts empty object is become like this {'a': 1} 这就是哈希的工作原理...你能简单解释一下...以便我更好地理解
  • 这里有一篇文章简单地解释了 JavaScript 对象是如何工作的。 developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/…