【问题标题】:Checking for Boolean Values in Typescript/Javascript Pertaining to "true", "false", and "undefined"检查 Typescript/Javascript 中与“true”、“false”和“undefined”相关的布尔值
【发布时间】:2017-12-03 19:02:53
【问题描述】:

我可以确定布尔检查的唯一结果是“真”还是“假”的明确方式是什么?换句话说,我想尽可能地排除“未定义”的可能性。两种选择是:

功能一:

private canMove = (currentOptionSelected): boolean => {
    if (this.client.services) {
        for (const service of this.client.services) {
            if (service === currentOptionSelected) {
                if (service.currentStage === 'enrolling') {
                    return true;
                }
            }
        }
    } 
}

功能二:

private canMove = (currentOptionSelected): boolean => {
    if (this.client.services) {
        for (const service of this.client.services) {
            if (service === currentOptionSelected) {
                return service.currentStage === 'enrolling';
            }
        }
    }
}

编辑:根据评论者的回复,更可靠的替代方法是显式返回“false”,如下所示:

private canMove = (currentOptionSelected): boolean => {
    if (this.client.services) {
        for (const service of this.client.services) {
            if (service === currentOptionSelected) {
                //You should also rethink this return statement
                return service.currentStage === 'enrolling';
            }
        }
    }
    return false;
}

我会通过询问是否为“client.services”存在的情况添加额外的“return 'false'”,但“currentStage !== 'enrolling”会更好?或者在这种情况下,第二个“else”子句会是多余的吗?

其次,他写道,我应该重新考虑 return 语句在函数中的位置。替代方案是什么?简而言之,我正在尝试找到最健壮但最简洁的方法来编写此函数。

【问题讨论】:

  • 第一个将返回true或undefined,第二个将返回true、false或undefined。
  • 第一个将在service === currentOptionSelected 为true 时立即返回一个值,而第二个将在内部if 语句为false 时继续迭代剩余的元素。跨度>
  • 我在这里问了一个更细微的问题。在上一个问题中,我没有包括第二个选项。所以这不是同一个问题。我特别想澄清何时返回“false”作为“true”的唯一替代方案,而不是得到“true”、“false”或“undefined”。换句话说,我想避免“未定义”的可能性。
  • 所有这些问题都已经得到解答。

标签: javascript function typescript boolean


【解决方案1】:

这些不是等价的。在第一个版本返回undefined 的某些情况下,第二个版本返回false。检查值是否明确为=== false 的调用者将观察到不同的行为。

两者都可以返回undefined,这可能不是很好。最好总是返回 true 或 false 的实际值

【讨论】:

    【解决方案2】:

    简短的回答是否,它们不等价:

    • 无论如何,第一个都不会返回false。
    • 如果service.currentStage !== 'enrolling',第二个可以返回false。

    但正如 Ryan 所说,两者都可以返回您应该避免的 undefined,当不满足条件时,您需要显式返回 false。

    这应该是你的代码:

    private canMove = (currentOptionSelected): boolean => {
        if (this.client.services) {
            for (const service of this.client.services) {
                if (service === currentOptionSelected) {
                    //You should also rethink this return statement
                    return service.currentStage === 'enrolling';
                }
            }
        }
        return false;
    }
    

    注意:

    • 这里的return false; 将确保您在何时返回false this.client.services 是 undefined。
    • 以这种方式在for 循环中使用return 语句是一个非常非常糟糕的主意,实际上您只会进行一次迭代。

    【讨论】:

    • 澄清一下,您是说您编写上述函数的方式是一个强大的解决方案吗?对于存在“client.services”但“currentStage !== 'enrolling”的情况是否会添加额外的“return 'false'”会更好?或者在这种情况下,第二个“else”子句是多余的吗?
    • 另外,如果您建议不要像我一样使用 return 语句,您会建议什么替代方案?编写此函数的可靠方法是什么?
    • @Ademo No if currentStage !== 'enrolling" false 将自动返回,但我所说的是该函数将只有一次迭代,因为您在循环中返回,所以它总是在第一次迭代中使用 return 退出函数。但是你能告诉我你为什么要这样使用它,你想达到什么目的?
    • 所以这是在 Angular 应用程序中使用的。而且我已经设置好了,每次用户做出新的“currentOptionSelected”选择时,这个函数都会运行。所以从这个意义上说,每次迭代运行一次就足够了。
    • 它不会遍历services,只是第一个服务并退出。如果这对你来说足够了,那就去吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2015-08-18
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多