【问题标题】:JavaScript !! operators [duplicate]JavaScript !!运营商 [重复]
【发布时间】:2010-12-26 09:53:18
【问题描述】:

可能重复:
What is the !! (not not) operator in JavaScript?

我见过运算符!!! 一样使用。例如

var filter = !!(document.body.filters);

如果我没记错的话,它相当于var filters = typeof document.body.filters != 'undefined'?

使用!! 是一个好习惯吗?

【问题讨论】:

标签: javascript


【解决方案1】:

这取决于你。 !! 所做的只是将其参数“转换”为布尔值。

【讨论】:

    【解决方案2】:

    这是将任何返回类型转换为布尔值的常用方法(通常是为了避免编译警告)。 第二:不,检查类型是否为“未定义”无论如何都是强制性的,并且“!!”覆盖不了。

    【讨论】:

    • “检查类型是否为“未定义”无论如何都是强制性的,而“!!”不能覆盖它是什么意思?
    • "!!"只允许您检查操作数是否为零,但只有“typeof()”可以告诉您操作数是否已定义。 “!!”对于未定义的操作数会抛出错误。
    • 好的,我明白你现在的意思了。 !(因此!!)会为未定义的操作数抛出错误并不总是正确的:例如,!!window.bananas 不会抛出错误,而!!bananas 会抛出错误。但一般来说,如果要测试一个对象或属性是否未定义,typeof(一个运算符,而不是一个函数,所以不需要括号)是要走的路。
    【解决方案3】:

    !否定右边的结果。所以 !!否定被否定的值,从而以右边的任何内容结束。

    编辑:如果您有布尔值,上述情况为真,其他类型的结果可能会有所不同......

    edit2 详细说明:!!是一种“类型转换”运算符。如果你在右边有一个布尔值,那么什么都不会发生。如果你在右边有一个布尔值以外的东西,那么第一个!会将右侧的任何内容转换为该值的布尔“版本”,第二个!将否定该值。 有点像说:返回非布尔值的真实值。 希望这是有道理的:)

    【讨论】:

    • 不是真的。这仅适用于布尔值,它不是问题的主题。
    • 不管原来的类型是什么都是真的。
    • 这取决于右边是否是布尔值。
    • 不,它没有。 !!! 操作的结果将始终为布尔值,无论其原始参数如何。
    • 事实上,无论你把多少个否定加在一起,结果总是布尔值。
    【解决方案4】:

    var filter = !!(document.body.filters);

    等价于

    var filters = typeof document.body.filters != 'undefined'

    !! 仅检查操作数是否为“真”,即在布尔表达式中使用时它的计算结果是否为真。它与typeof 无关。一般来说,对于主机对象(例如document.body.filters),您最好使用typeof 检查。以下文章是关于这个主题的好读物:http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting

    【讨论】:

      【解决方案5】:

      如果它是一个值为“未定义”的字符串呢?

      我觉得 !!(表达式) 很整洁。

      【讨论】:

      • 那么typeof表达式将返回“string”
      猜你喜欢
      • 2016-02-27
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多