【问题标题】:JS double exclamation -- is there any good reason to use it?JS 双感叹号——有什么好的理由使用它吗?
【发布时间】:2011-11-20 13:28:46
【问题描述】:

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

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

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

if(randomvar) alert('Works');

使用这种方法,如果变量未定义,它会静默失败。这让我完全质疑使用双感叹号。有没有什么情况可以让这个运营商真正受益?

【问题讨论】:

    标签: javascript operators boolean shorthand


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      这对双方都有好处

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

      【讨论】:

      • (赞成使用“真实性”这个词!)很好的解释,同样值得注意的是,当你像这样使用这个运算符时:return !!(window.Object && (obj1.function1 || obj.2function2))); 它扩展了所有的“强制转换”事物。 convertallthethings.jpeg
      【解决方案3】:

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

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

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

      挠头……

      【讨论】:

        【解决方案4】:

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

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

        这是一个例子:

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

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

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

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

        【讨论】:

        • !!paramparam === true 不一样; !!param 将为每个“假”值返回 falsefalseundefinedNaN) 而 param === true 将仅返回 true,如果 param 是布尔类型,并且设置为'真的'。就像你说的,如果团队同意类型应该是 Boolean,不要将它传递给其他类型。我个人在将参数传递给函数时使用与其类型相关的命名参数的约定,如果它需要严格的类型,只是作为提醒。喜欢function chocolateStarfish(xInt, yBool){//stuff};等。
        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 2019-02-13
        • 2022-01-03
        • 2012-03-06
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多