JS双重感叹 - 是否有充分的理由使用它?

时间:2011-09-19 20:12:59

标签: javascript operators boolean shorthand

我和一位同事一直在争论这个话题大约一个星期。我非常喜欢速记代码,使用三元等,无论我在哪里。最近,他一直在挑剔我使用双重感叹词。在经过多次测试后,我开始同意他的观点......在我的代码中使用双重感叹词可能并不明智。考虑一下:

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

上面的示例按预期工作。但是,如果我们检查可能返回undefined的变量,我们会收到错误,尤其是在IE7中。但是,如果我们在控制台中运行它,我们会得到预期的结果:

if(randomvar) alert('Works');

使用这种方法,如果变量未定义,则无提示失败。这让我质疑完全使用双重感叹词。是否存在实际上使该运营商受益的情况?

4 个答案:

答案 0 :(得分:9)

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

这对两者都有好处

  1. 捕捉价值的真实性
  2. 释放原始对象以进行收集(应该是最终参考)
  3. 有助于防止以后使用强制平等(==)的对象的错误使用。不会阻止它们全部,但强制它降为bool会删除一组场景。

答案 1 :(得分:5)

!!xx强制转换为布尔值,其属性为x == !!xtypeof !!x === "boolean"。 (如果你覆盖valueOf,一般情况可能不正确,但我现在不想考虑它。)

答案 2 :(得分:1)

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

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

以下是一个例子:

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

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

使用:test(1)调用不会弹出警告窗口 - 尽管通常认为1是truetrue - ish值。是的,有人可能会认为这取决于团队中的协议以及每个开发人员是否有责任传递当前数据类型 - 但JavaScript中的正确数据类型是什么?特别是当你没有编译器来验证哪个是哪个时。

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

答案 3 :(得分:0)

所以,我理解typeof !!x === "boolean"及其背后的逻辑(!x转换为反向布尔,!!x反转,等等),但我想知道它是否有问题?如果你施放了一个未定义的变量,你的手上最终会出现脚本错误。如果!!x == false,我希望typeof !!x === "undefined",但事实并非如此。这似乎是更安全的选择:

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

有人可以提供使用!!x更合适的方案吗?目前,我没有看到使用它的好处。

抓我的头......