【问题标题】:jQuery prop() and Google Closure CompilerjQuery prop() 和 Google Closure 编译器
【发布时间】:2013-04-30 15:52:12
【问题描述】:

我正在使用 google 闭包编译器,但我得到了一个我不理解的变暖。我需要测试是否选中了单选按钮,所以我有以下代码:

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/jquery-1.8.js
// ==/ClosureCompiler==

function test() {

  var TheBool = $('#SomeElement').prop('checked');

  if (TheBool === true) {
     alert('checked');
   }
}

我收到一条警告,说这是一个总是评估为假的条件,即使我知道情况并非如此。

您可以在http://closure-compiler.appspot.com/home 尝试一下,然后复制粘贴我的代码(确保选中“优化:高级”)

如何让这个警告消失?

【问题讨论】:

  • 我没有收到任何警告或错误...
  • @Ian:那是因为你没有将编译模式设置为“高级”。
  • 你说的很对。对此感到抱歉:)
  • 如果您删除 === true,警告就会消失。也许是因为没有必要与布尔值进行比较,当结果是布尔值并且无论如何都用作条件时
  • @Ian: bool 的重点是测试单选按钮是否被选中,因此我需要真/假测试

标签: javascript jquery google-closure-compiler


【解决方案1】:

这似乎是 Google 提供的 externs file 中的一个错误。

他们错误地将jQuery.prototype.prop 声明为返回要么字符串或jQuery,并忽略它可以返回布尔值的事实;

/**
 * @param {(string|Object.<string,*>)} arg1
 * @param {(string|number|boolean|function(number,String))=} arg2
 * @return {(string|!jQuery)}
 */
jQuery.prototype.prop = function(arg1, arg2) {};

...什么时候该是;

/**
 * @param {(string|Object.<string,*>)} arg1
 * @param {(string|number|boolean|function(number,String))=} arg2
 * @return {(string|boolean|!jQuery)}
 */
jQuery.prototype.prop = function(arg1, arg2) {};

我修复了这个和uploaded it,当使用外部声明时,你的问题得到了修复;

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://files.mattlunn.me.uk/permanent/jquery-1.8.js
// ==/ClosureCompiler==

function test() {

  var TheBool = $('#SomeElement').prop('checked');

  if (TheBool === true) {
     alert('checked');
   }

}

您可以通过不直接检查=== true绕过此;只需if (TheBool) 就足够了。


FWIW,这是他们问题页面上的reported,并已提交补丁。

【讨论】:

  • 好的,很高兴知道这一点。可能是负责外部人员的人可以解决它。感谢您的回答。
【解决方案2】:

prop 返回一个布尔值。所以没有必要检查它是否=== true。只需使用:

if (TheBool) {
    alert('checked');
}

为了让阅读时更容易理解,请尝试:

var elementIsChecked = $('#SomeElement').prop('checked');
// `elementIsChecked` is either true or false

if (elementIsChecked) { // `elementIsChecked` is coerced into a boolean, but it already is, so it doesn't matter
    alert('checked');
}

也许你会明白为什么一开始就没有必要。

if () 中使用的表达式被评估为真或假,无论它们的结果是真还是假。它恰好是 prop 实际上确实返回 true 或 false。

【讨论】:

  • 不,你不明白:api.jquery.com/prop 有时是真的有时是假的,这取决于控件是否被选中。
  • @frenchie:伊恩说的是真的……试试看。
  • @frenchie 我不明白你在说什么。你以前用过if 语句吗?
  • 是的,我知道 if (a) 和 if (a === true) 是一样的,但这不是这个问题所指的问题;查看接受的答案,这与 Google 外部定义中的错误有关。
  • @frenchie 我完全理解这不是对您发现的错误的修复,但是当您删除 === true 时警告确实消失了。同样,我知道这不是真正的解决方案,但同时,=== true 对于这种情况和大多数情况都是不必要的。您似乎只是在争论直到现在才需要它
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多