Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查真实的明确性是不是设计上的错误?_Javascript_Weakly Typed - Fatal编程技术网

Javascript 检查真实的明确性是不是设计上的错误?

Javascript 检查真实的明确性是不是设计上的错误?,javascript,weakly-typed,Javascript,Weakly Typed,显式检查布尔值true是否被认为是错误的。如果(成功),做一个简单的会更好吗 我看过很多关于如果(someBoolean===true)在强类型语言中是可怕的代码,但在弱类型语言中也被认为是糟糕的代码的笑话 这将适用于对if语句执行类型强制的任何弱类型语言 一个具体的例子是: var onSuccess = function (JSONfromServer) { // explicitly check for the boolean value `true` if (JSONfr

显式检查布尔值true是否被认为是错误的。如果(成功),做一个简单的
会更好吗

我看过很多关于
如果(someBoolean===true)
在强类型语言中是可怕的代码,但在弱类型语言中也被认为是糟糕的代码的笑话

这将适用于对if语句执行类型强制的任何弱类型语言

一个具体的例子是:

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。所以它可能是任何东西。如果布尔值为真,那么就成功了。如果它是一个错误处理对象,那么它将被处理。如果是别的事情,可能会被悄悄处理

问题是让服务器以JSON的形式返回
true
,并检查处理操作成功的情况的好方法


不过,我想避免特定于JavaScript和AJAX。

我自己对此有两种想法

在一个方面,您发布的代码示例很好,因为Javascript处理类型强制的方式。一个简单的
if(success)
将进入if块,只要
success
是真实的-例如,一个非空字符串将执行此操作。三重等于保证
成功
确实是布尔值
,这是一个比较短版本(可能是您想要的版本)更有力的保证

然而,如果你需要这个-也就是说,你不知道
success
是一个布尔值,还是一个字符串,还是一个整数-我会说这本身就是一种代码味道。不管你如何进行比较,我总是和一个不可避免的布尔变量进行比较;在这一点上,使用哪种形式的比较并不重要,因为它们是等价的。事实上,我甚至会引入这样一个“冗余”变量:

var successCount = items.size(); // or some other way to get an integer
var success = successCount > 0;
if (success) {
   ...
}
所以,嗯,是的。我认为没有人会真的抱怨在比较中使用
===
,因为它的功能不同。但是出于同样的原因,如果你明显地使用了布尔
success
标志,那么我认为也不应该有人抱怨短样式


(关于你的第一句话,我认为在动态类型语言中显式检查布尔值true并不坏,如果该值确实是你想要的。只有当静态类型已经将变量约束为布尔值时,这才是多余的。)

会出什么问题?没错,没什么。在最好的情况下,你的函数什么也不做。这比让一些随机参数被接受为
true
更好

如果您在其他所有时间都使用
true
,那么您还应该明确检查它

虽然我肯定赞成Python中的
if foo:
,但这里有一个很大的区别,那就是最终一些随机jQuery程序员可能会花很长时间思考“哦!它还可以处理字符串和
new Boolean()
”并使用它


关于肖恩建议使用
这实际上取决于您是否只希望接受布尔值或任何真实的值。对于一个干净的API,我只接受布尔值。

对于Javascript,值得知道的是,除了布尔值true和false之外,值可以是truty和falsy

考虑:

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.
对象的所有其他值都是真实的


如果真值和伪值导致逻辑中的错误,则应考虑明确使用<代码>==和<代码>!=<代码>操作符,以确保对象按类型和值进行比较。

我读过很多关于JavaScript的书,我从来没有见过有人说如果(成功)
是一种不好的做法。我会做的。是否确定
success
参数始终为布尔值?现在,如果这会变成其他东西,你必须编辑这个函数。但是如果您只使用
if(success)
,它将适用于其他“truthy”和“false”值,例如字符串与空字符串,或1与0


如果您想将该参数转换为布尔值,只需对其进行双重求反:
!!成功
;但在这样的条件中,这是不必要的。

通常,您希望布尔变量名如下:

success, enabled, pass
要有真正的价值。所以

if(success) //or

if(enabled) //or

if(pass) //or

if(enabled) //or
是可以理解和逻辑可读的。但是如果你有如下变量:

result, status, port1.bit7
最好写下:

if(result == true) //or

if(status == false) //or

if(port1.bit7 == true)
因为它比下面的例子更容易理解:

if(result)
{
  ....
}

可读性就是可维护性。

是代码气味还是语言气味,还是实现细节还是惯例

真的,这要视情况而定

将所有的假值和真值放入一个bucket可以简化事情,直到差异变得重要,无论是糟糕的代码设计还是因为某种原因它确实很重要

同样,Hoare为发明
null
引用而道歉,正如我所看到的,它与这个真实问题的根源一样接近。JavaScript的设计通过添加更多的真实值而混淆了这个问题,导致许多人只提倡显式检查以避免难以追踪的错误(Douglas Crockford)。JavaScript社区已经接受了这种语言本身,但有点卡住了。Python核心团队则相反,因为语言设计似乎着眼于简化事情,而不是混淆它们,核心团队仍在计划对语言进行更改。随着时间的推移,无论是惯例还是语言设计,小的迭代更改都是大的改进的本质

两者都是针对其特定情况的好策略。我并不是说这是唯一的改进来源,但这是目前改进的主要来源

例如
True
False
实际上是子类
if a_reference:
    pass
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
function foo(x, y, z) {
    // Certainly not clear to the programmer.
}
if (foo === undefined) {
    // pass
}
sessionStorage.setItem('completed',true);
if sessionStorage.getItem('completed') === 'true';