【问题标题】:window.jQuery==true evaluates to false, although window.jQuery!=false evaluates to truewindow.jQuery==true 计算结果为 false,尽管 window.jQuery!=false 计算结果为 true
【发布时间】:2013-09-03 11:05:34
【问题描述】:

这是我无法理解的事情。

据我了解,JavaScript 具有 truthyfalsy 值:

假值:

0

未定义


"" (空字符串)

真实值:

任何不是虚假值的东西

如果 window.jQuery 已正确加载,则它不应评估为 false(或者更确切地说,undefined)。以下条件将返回 true

window.jQuery != false

但是,以下条件将返回 false

window.jQuery == true

(我对所有这些都使用==,而不是===,否则window.jQuery 将始终评估为false,除非它实际上是一个包含值false 的布尔值)。

这里发生了什么?当然,如果条件不计算为false,那么它必须计算为true

【问题讨论】:

  • 因为您最终将字符串与数字进行比较。见ecma-international.org/ecma-262/5.1/#sec-11.9.3
  • JavaScript 确实有真值和假值,但您在这里期望的是两个不同的真值(jQuerytrue)相互比较。这完全是另一回事。
  • 5 是真的,10 是真的,但你不会指望5 == 10 是真的,对吧?
  • !(window.jQuery == true) 与 window.jQuery != false 不同。这是两种不同的表达方式。

标签: javascript


【解决方案1】:

jQuery 是一个函数,它不是== true,所以你得到false,它是!= false,所以你得到true

我认为您已经知道== 比较与布尔转换相同。它不是。要进行布尔转换,您可以执行Boolean(window.jQuery) == true,您将得到true。或者只是!!window.jQuery == true

当您转换为布尔值时,然后您将在所有情况下转换为 truefalsenullundefinedNaN""0.

最终如果你想查看 jQuery 是否已加载,那么你只需...

if (window.jQuery) {

这将为您执行布尔转换。

【讨论】:

  • 我还是不明白 - 有什么东西不能评估为 false true?
  • 好吧,任何不是truefalse 的值都将经过类型强制处理以执行比较。 == 使用的类型强制转换过程不是简单的布尔转换。它要复杂得多。
  • 有很多值不会评估为假或真。 3, null, "foo", [1, 2, 3], {key: 3}.
  • 我想我现在明白了 - 我的错误是 == 在比较之前会将所有内容转换为布尔值,感谢您的澄清。
【解决方案2】:

在比较不同类型的值时,一些内部转换会隐式发生。假设正在使用 jQuery,您将拥有以下内容:

对于 window.jQuery != false:

  1. window.jQuery != false
  2. window.jQuery.toString() != 0
  3. "function (e,t){return new x.fn.init(e,t,r)}" != 0
  4. Number("function (e,t){return new x.fn.init(e,t,r)}") != 0
  5. NaN != 0
  6. 是的

对于 window.jQuery == true,会发生类似的事情:

  1. window.jQuery == true
  2. window.jQuery.toString() == 1
  3. "function (e,t){return new x.fn.init(e,t,r)}" == 1
  4. Number("function (e,t){return new x.fn.init(e,t,r)}") == 1
  5. NaN == 1

来源:http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

【讨论】:

    【解决方案3】:

    当您将值与truefalse 进行比较时,它不仅仅是比较它们的真实性。 truefalse 是特定的值,就像不同的数字和字符串一样。仅仅因为两个值具有相同的真实性,并不意味着它们实际上比较相等。

    如果你想比较两个值的真实性,你可以通过强制它们为布尔类型来做到这一点。一个简单的方法是使用布尔反转:

    if (!foo == !bar)
    

    将判断foobar 是否具有相同的真实性。

    【讨论】:

      【解决方案4】:

      如果您想查看是否加载了 jQuery。这会告诉你。

      if (jQuery) {  
          // jQuery is loaded  
      } else {
          // jQuery is not loaded
      }
      

      查看这篇博文:

      Check if jQuery is Loaded

      【讨论】:

      • 事实上,这将引发错误:如果未定义 jQuery,则会引发此错误(至少在 Chrome 中)Uncaught ReferenceError: jQuery is not defined 。需要window.jQuery
      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2018-12-27
      相关资源
      最近更新 更多