Is checking for true explicity bad by design?
显式检查布尔值真是否被认为是错误的?做一个简单的
我看过各种各样的关于
这将适用于对if语句执行类型强制的任何弱类型语言。
一个具体的例子是:
1 2 3 4 5 6 7 8 9 | var onSuccess = function (JSONfromServer) { // explicitly check for the boolean value `true` if (JSONfromServer === true) { // do some things } } // pass it to an ajax as a callback doSomeAjax(onSuccess); |
[编辑]
在这种特殊情况下,success变量是从服务器返回的任何有效JSON。所以它可以是任何东西。如果它是布尔值,那么就成功了。如果它是一个错误处理对象,那么它将被处理。如果它是其他东西,那么它可能会被安静地处理。
问题是让服务器将
不过,我想避免专门针对javascript&ajax。
有了javascript,我们就知道除了布尔值的真和假之外,值还可以是真实和不可靠的。
考虑:
1 2 3 4 5 6 | if (false) // evaluates to false. if (0) // evaluates to false, 0 is falsy. if ("") // evaluates to false, empty strings are falsy. if (null) // evaluates to false, null values are falsy. if (undefined) // evaluates to false, undefined values are falsy. if (NaN) // evaluates to false, NaN is falsy. |
对象的所有其他值都是真实的。
如果truthy和falsy值导致逻辑错误,则应考虑显式使用
我自己也有两种想法。
在一方面,由于JavaScript处理类型强制的方式,您发布的代码示例很好。只要
但是,如果你需要这个——也就是说,你不知道
1 2 3 4 5 | var successCount = items.size(); // or some other way to get an integer var success = successCount > 0; if (success) { ... } |
所以,呃,是的。我认为没有人会因为
(不过,对于您的第一句话,我认为在动态类型语言中显式检查布尔值true并不坏,如果该值实际上是您想要的。当静态类型已经将变量约束为布尔值时,这是多余的。)
通常情况下,需要布尔变量名,如:
1 | success, enabled, pass |
有一个真正的价值。所以
1 2 3 4 5 6 7 | if(success) //or if(enabled) //or if(pass) //or if(enabled) //or |
是可以理解和逻辑可读的。但是如果你有如下变量:
1 | result, status, port1.bit7 |
最好是写:
1 2 3 4 5 | if(result == true) //or if(status == false) //or if(port1.bit7 == true) |
因为它比下面的例子更容易理解:
1 2 3 4 | if(result) { .... } |
可读性就是可维护性。
什么会出错?没错,没什么。在最好的情况下,您的函数什么也不做。这比把一些随机的论点当作
如果您一直在使用
虽然我确信在python中我支持
关于肖恩使用
要添加到此对话中,sessionstorage和localstorage变量今天只能存储为字符串,因此如果使用:
1 | sessionStorage.setItem('completed',true); |
它将实际转换为字符串并存储为"true"。我见过很多人编写方法和转换来操作这个值,这样他们就可以使用一个使用布尔值的if语句,其中
1 | if sessionStorage.getItem('completed') === 'true'; |
在我看来,这就足够了,完全可以辨认和维护。
我读过很多关于javascript的文章,我从未见过有人说
如果要将该参数转换为其布尔值,只需对其进行二次求反:
它是代码气味还是语言气味,或者是实现细节还是约定的问题?
实际上,这取决于具体情况。
把所有的假值和真值放进一个桶中可以简化事情,直到差异变得重要为止,不管是错误的代码设计,还是因为某些原因它确实很重要。
同样,霍尔也为自己发明了
这两种策略都是针对特定情况的好策略。我不是说这是改进的唯一来源,但这是目前改进的主要来源。
例如,在python中,
1 2 | if a_reference: pass |
在Python中,唯一真正需要使用
1 2 3 4 5 6 7 | def foo(bar=optional): # NOTE I made up this idealistic construct """Looks good at the surface""" pass def foo(bar=None): """But this is clear to the programmer""" pass |
javascript隐式地将所有变量作为可选变量:
1 2 3 | function foo(x, y, z) { // Certainly not clear to the programmer. } |
Crockford提倡明确地检查事物,以尝试为语言增加一些清晰度。
1 2 3 | if (foo === undefined) { // pass } |
基本上,javascript添加了空引用2,称为
不过,从长远来看,我确实认为这是一个愚蠢的决定。