【问题标题】:How can avoid !! comparation in JavaScript?怎么能避免!! JavaScript 中的比较?
【发布时间】:2016-12-13 06:42:16
【问题描述】:

我正在使用这个“!!”比较,以便与“未定义”进行比较。但是,还有其他方法吗?

isWidgetTemplatesLoaded: function(widgetName) {
           return !!templates[widgetName];
}

谢谢

【问题讨论】:

  • 模板类型[widgetName] !== "undefined"
  • !! 会将templates[widgetName] 的值转换为布尔值,就像Boolean(templates[widgetName]) 一样。 false == undefinedtemplates[widgetName] == undefined 中的直接比较相比如何?

标签: javascript boolean comparator boolean-logic


【解决方案1】:

您可以使用 typeof 来检查未定义:

(typeof templates[widgetName] !== 'undefined')

typeof 总是返回一个字符串。如果变量的值未定义或变量不存在,则返回“未定义”。

【讨论】:

    【解决方案2】:

    您可以使用typeof 运算符

    typeof templates[widgetName];
    

    否则你也可以这样使用

    if (templates[widgetName] === undefined) {
       // rest of code
    }
    else {
       // rest of code
    }
    

    【讨论】:

    • 谢谢。这会产生完全相同的效果吗?
    【解决方案3】:

    要检查undefined,您可以使用无转换相等/不同运算符:

    if (x !== undefined) { ... }
    if (y === undefined) { ... }
    

    但是请注意,这与!! 的含义不同。例如,即使对于 falsenull0"",双重否定也会返回 true,尽管这些值不是 undefined

    顺便说一句,在 Javascript 中,您基本上应该始终使用 ===!== 而不是 ==!=,除非您真的需要疯狂的隐式转换,即相等/不同的运算符做(没有人需要)。好的 Javascript 编辑器会警告您任何使用 ==!= 的行为,因为它们只是隐藏错误的地方。

    在具体的问题代码中,!! 逻辑在哲学层面上似乎是错误的,因为空模板可能是"",并且此函数会说模板尚未加载,而它已被加载并且只是恰好是空字符串。

    【讨论】:

    • 也许这是因为我来自Java世界,但让我烦恼的是看到!!
    • @stackman:确实编写像x !== undefined 这样的代码要好得多(唯一的烦恼可能是有人希望你将nullundefined 一样对待)。不幸的是,Javascript 同时具有 nullundefined 并且没有简单的方法来检查它们,因为 0 和空字符串也是“假的”。
    【解决方案4】:

    您可以使用in 运算符,如果您知道该属性是否存在某个值,而不是undefined

    return widgetName in templates;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多