为什么这两段代码返回的值不同

Why are these two pieces of code returning different values?

本文关键字:返回 代码 两段 为什么      更新时间:2023-09-26

我正在通过在线书籍《Eloquent Javascript》学习Javascript——顺便说一句,这是一个很棒的资源。我在数据结构一章中发现了这个函数:

function tableFor(event,journal){
var table = [0,0,0,0]; 
for (var i = 0; i < journal.length; i++){
    var entry = journal[i], index = 0;
    if (hasEvent(event,entry)) index += 1; 
    if (entry.squirrel) index += 2; 
        table[index] += 1;
    }
return table;
}

正如您所看到的,它在一个数组中迭代,并根据第一个对象具有参数event的次数输出另一个数组。我重写了这个稍微不同的像这样。。。

function tableFor(event,journal){
var table = [0,0,0,0];
for (var i = 0; i < journal.length; i++){ 
    var entry = journal[i], index = 0;
    if (hasEvent(event,entry)){
        index += 1;
        }
    if (entry.squirrel){
        index += 2; 
        table[index] += 1;
        }
}
return table;
}

唯一的变化是if语句周围的括号,我认为这是最佳实践。但是,它输出的值与第一段代码不同。为什么会发生这种情况?是否存在我不理解的范围问题??如果你不知道我在说什么,这里有一个链接到书中的章节:Eloquent JavaScript以及指向对象JOURNAL:JavaScript对象的链接

谢谢你的帮助!

在原始代码中,这是:

if (entry.squirrel) index += 2; 
    table[index] += 1;

实际上是两个不相关的陈述:

if (entry.squirrel) { index += 2; }
table[index] += 1;

它只是缩进得很厉害。在Javascript中,与大多数C派生语言一样,当条件为true时,if之后的单个语句可以构成要执行的块。若要包含多个语句,必须使用大括号。

不带括号的if语句只有在满足条件时才会执行下一条指令。

您提供的第一个代码段包含令人困惑的缩进,因为它表明以下指令("table[index]+=1;")是条件语句的一部分,但在JavaScript中,缩进并不重要。

所以在现实中,如果你使用的不是括号,第一个分号表达式就是右括号所在的位置

正确缩进的代码:

function tableFor(event,journal){
    var table = [0,0,0,0]; 
    for (var i = 0; i < journal.length; i++){
        var entry = journal[i], index = 0;
        if (hasEvent(event,entry)) index += 1; 
        if (entry.squirrel) index += 2; 
        table[index] += 1;
   }
   return table;
}

带支架

function tableFor(event,journal){
    var table = [0,0,0,0]; 
    for (var i = 0; i < journal.length; i++){
        var entry = journal[i], index = 0;
        if (hasEvent(event,entry)) {
            index += 1
        }; 
        if (entry.squirrel) {
            index += 2
        }; 
        table[index] += 1;
   }
   return table;
}

您已经放置了'table[index]+=1;'在if语句中,在以前没有的地方。原始代码中的标签显示给人一种误导性的印象,但原始的无包装if语句只"包装"在"index+=2;"周围

这是因为你把括号放错了地方。应该是这样的:

function tableFor(event,journal){
var table = [0,0,0,0];
for (var i = 0; i < journal.length; i++){ 
var entry = journal[i], index = 0;
if (hasEvent(event,entry)){
    index += 1;
    }
if (entry.squirrel){
    index += 2; 
    }
    table[index] += 1;
}
return table;

table[index]行不属于if语句。