2011-09-19 81 views
5

我一直在与同事辩论这个话题大概一周。我非常喜欢速记代码,尽可能使用三元数等。最近,他一直在关注我使用双重惊叹号。经过多次测试后,我开始同意他的观点......在我的代码中使用双重惊叹号可能并不明智。考虑到这一点:JS双感叹号 - 有没有什么好的理由使用它?

var myvar = "Hello"; 
return (!!myvar ? "Var is set" : "Var is not set"); 

上述示例按预期工作。但是,如果我们检查可能返回未定义的变量,则会发生错误,尤其是在IE7中。我们得到了我们预期的结果,但是,如果我们在控制台中运行以下命令:

​​

使用这种方法,如果变量是不确定的,它静静地失败。这让我质疑完全使用双重感叹号。有没有真正让这个运营商受益的情况?

回答

5

!!x强制x为一个布尔值,其属性为x == !!xtypeof !!x === "boolean"。 (如果您覆盖valueOf,可能并非如此,但我现在不想考虑它。)

9

在JavaScript中有一个有效的用于!!。这是一个表达式,它将取值并转换为布尔值truefalse。它基本上将当前状态强制转换为布尔值。

这有利于双方

  1. 捕捉值
  2. 腾出收集原始对象的感实性(应该说是最终参考)
  3. 有助于防止物体后不正确用法强制平等(==)。不会阻止它们全部,而是将它强制为bool删除一组场景。
+0

(给予好评使用单词“感实性”!) 很好的解释,这也是值得注意的是,当你使用这个操作是这样的: 'return !!(window.Object &&(obj1.function1 || obj.2function2)));' 它扩展了整个“强制转换”所有的东西。 convertallthethings.jpeg –

0

所以,我的理解是typeof !!x === "boolean"和它背后的逻辑(!x蒙上为倒布尔,!!x回反向,等等),但我想知道,如果它是自然存在问题?如果您投射一个未定义的变量,则最终会出现脚本错误。我期望!!x == false如果typeof !!x === "undefined",但事实并非如此。看来,这将是更安全的选择:

if((typeof x != "undefined") && (x != null)) { ... } 

有人可以提供其中使用!!x是比较合适的场景?目前,我没有看到使用它的好处。

抓我的头......

1

我在IE测试 - !!undefined返回false。我认为这是一种正确的行为。

至于哪里!!是(或可能)有用。

下面是一个例子:

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

function test(param) { if (param === true) { alert('OK'); } }

与呼叫:test(1)不会弹出警告窗口 - 尽管人们普遍认为1一个true或一个true价值。是的,有人可能会认为这取决于团队中的协议,并且每个开发人员都负责传递正确的数据类型 - 但JavaScript中正确的数据类型是什么?特别是当你没有编译器来验证哪个是哪个。

因此,在上述情况下,我会使用的if (!!param)代替if (param === true)

+0

'!! param'和'param === true'是不一样的; '!! param'将为每个“falsy”值,'false','undefined','NaN'返回'false',而'param === true'只会返回'true',如果'param'是布尔类型,并设置为“true”。 就像你所说的,如果团队同意这个类型应该是布尔型的,不要传递其他类型。如果它需要严格的类型,就像提醒一样,我个人使用约定来将参数命名为与其类型相关的参数。像'function chocolatestarfish(xInt,yBool){// stuff};'等 –