6

我已经和一位同事讨论这个话题大约一个星期了。我非常喜欢速记代码,尽可能使用三元组等。最近,他一直在指责我使用双感叹号。在运行了无数次测试之后,我开始同意他的观点……在我的代码中使用双感叹号可能并不明智。考虑一下:

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

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

if(randomvar) alert('Works');

使用这种方法,如果变量未定义,它会静默失败。这让我完全质疑使用双感叹号。是否存在实际上使该操作员受益的情况?

4

4 回答 4

9

!!在 javascript 中有一个有效的用途。这是一个表达式,它将接受一个值并转换为布尔值truefalse. 它本质上将当前状态强制转换为布尔值。

这对双方都有好处

  1. 捕捉价值的真实性
  2. 释放原始对象以供收集(应该是最终引用)
  3. 有助于防止以后不正确地使用具有强制相等 ( ==) 的对象。不会阻止它们,但将其强制为 bool 会删除一组场景。
于 2011-09-19T20:16:27.823 回答
6

!!x强制x转换为布尔值,具有属性x == !!xtypeof !!x === "boolean"。(如果你 override 可能不是真的valueOf,但我现在不想考虑它。)

于 2011-09-19T20:16:10.600 回答
1

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

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

这是一个例子:

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

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

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

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

于 2014-03-13T22:19:24.967 回答
0

所以,我理解这一点typeof !!x === "boolean"及其背后的逻辑(!x转换为反转布尔值、!!x反转等),但我想知道它是否天生就有问题?如果你强制转换一个未定义的变量,你最终会遇到脚本错误。我希望!!x == falseif typeof !!x === "undefined",但事实并非如此。似乎这将是更安全的选择:

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

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

挠着我的头...

于 2011-09-20T15:40:50.310 回答