Javascript JS双感叹号——有什么好的理由使用它吗?

Javascript JS双感叹号——有什么好的理由使用它吗?,javascript,operators,boolean,shorthand,Javascript,Operators,Boolean,Shorthand,我已经和一个同事讨论这个话题大约一个星期了。我非常喜欢速记代码,尽可能地使用ternaries等等。最近,他对我使用双重感叹词的事一直挑剔我。经过多次测试,我开始同意他的观点。。。在我的代码中使用双感叹号可能不明智。考虑这一点: var myvar = "Hello"; return (!!myvar ? "Var is set" : "Var is not set"); 上面的示例按预期工作。然而,如果我们检查一个可能返回未定义的变量,我们会得到一个错误,尤其是在IE7中。但是,如果我们在控

我已经和一个同事讨论这个话题大约一个星期了。我非常喜欢速记代码,尽可能地使用ternaries等等。最近,他对我使用双重感叹词的事一直挑剔我。经过多次测试,我开始同意他的观点。。。在我的代码中使用双感叹号可能不明智。考虑这一点:

var myvar = "Hello";
return (!!myvar ? "Var is set" : "Var is not set");
上面的示例按预期工作。然而,如果我们检查一个可能返回未定义的变量,我们会得到一个错误,尤其是在IE7中。但是,如果我们在控制台中运行此命令,则会得到预期结果:

if(randomvar) alert('Works');

使用这种方法,如果变量未定义,它将以静默方式失败。这使我怀疑双重感叹词的用法。是否存在使该操作员受益的情况?

!!x
强制
x
为布尔值,属性为
x==!!x
类型!!x==“布尔值”
。(如果您重写
valueOf
,通常情况下可能不正确,但我现在不想考虑它。)

的有效用法在javascript中。这是一个表达式,它将获取一个值并转换为布尔值
true
false
。它本质上是将当前状态强制为布尔值

这对双方都有好处

  • 捕捉价值的真实性
  • 释放原始对象以进行收集(应为最终引用)
  • 有助于防止以后不正确地使用强制相等的对象(
    =
    )。这并不能完全阻止它们,但将其强制为bool会删除一组场景
    所以,我理解
    typeof!!x==“boolean”
    及其背后的逻辑(
    !x
    转换为反向布尔,
    !!x
    反向,等等),但我想知道它是否本质上有问题?如果您强制转换一个未定义的变量,那么最终会出现脚本错误。我希望
    !!x==false
    if
    typeof!!x==“未定义”
    ,但事实并非如此。这似乎是更安全的选择:

    if((typeof x != "undefined") && (x != null)) { ... }
    
    有人能提供一个使用
    !!x
    更合适吗?目前,我看不到使用它的好处


    挠头…

    我在IE中测试了-
    !!未定义
    返回false。我相信这是正确的行为

    至于何处
    是(或可能是)有用的

    下面是一个例子:

    假设您有一个接受参数的函数:

    功能测试(参数)
    {
    如果(参数===真)
    {
    警报(“正常”);
    }
    }

    使用以下命令调用:
    test(1)
    将不会弹出警报窗口-尽管通常认为1是
    true
    true
    -ish值。是的,有人可能会争辩说,传递currect数据类型取决于团队中的一致意见和每个开发人员的责任——但是JavaScript中正确的数据类型是什么?尤其是当你没有编译器来验证哪个是哪个的时候


    因此,在上面的情况下,我将使用
    if(!!param)
    而不是
    if(param==true)

    (使用单词“truthiness”时向上投票!)这是一个很好的解释,值得注意的是,当您像这样使用此运算符时:
    return!!(window.Object&(obj1.function1 | | obj.2function2))它将整个“强制转换”扩展到所有内容。转换所有内容.jpeg
    !!param
    param===true
    不相同<代码>!!param
    将为每个“falsy”值返回
    false
    未定义的
    NaN
    ),而
    param===true
    仅在
    param
    为布尔类型且设置为“true”时返回
    true
    。正如您所说,如果团队同意该类型应为布尔类型,则不要将其传递给其他类型。我个人在将参数传递到函数中时,如果需要严格的类型,我会使用将参数命名为与其类型相关的东西的约定,作为提醒。像
    功能巧克力海星(xInt,yBool){//stuff}等。