jQuery prop()和Google Closure Compiler

时间:2013-04-30 15:52:12

标签: javascript jquery google-closure-compiler

我正在使用谷歌闭包编译器,我一直在变暖,我不明白。我需要测试是否选中了一个单选按钮,所以我有以下代码:

// ==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');
   }
}

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

enter image description here

您可以在http://closure-compiler.appspot.com/home尝试此操作并按照我的方式复制粘贴代码(确保选中“优化:高级”)

如何使此警告消失?

2 个答案:

答案 0 :(得分:3)

这似乎是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,并提交了补丁。

答案 1 :(得分:1)

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。