我正在使用谷歌闭包编译器,我一直在变暖,我不明白。我需要测试是否选中了一个单选按钮,所以我有以下代码:
// ==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尝试此操作并按照我的方式复制粘贴代码(确保选中“优化:高级”)
如何使此警告消失?
答案 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。