1

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

// ==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上尝试一下,然后复制粘贴我的代码(确保选中“优化:高级”)

如何使此警告消失?

4

2 回答 2

3

这似乎是 谷歌提供的externs文件中的一个错误。

他们错误地声明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) {};

我修复了这个并上传了它,当使用 externs 的声明时,你的问题就解决了;

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

}

您可以通过不直接检查;来绕过它。=== trueif (TheBool)足够了。


FWIW,这已在他们的问题页面上报告,并提交了一个补丁。

于 2013-04-30T16:05:27.003 回答
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实际确实返回真或假。

于 2013-04-30T16:09:56.043 回答