我确信必须有一个非常简单的答案,但冒着听起来很愚蠢的风险 - 我无法让这个开关语句起作用。输入var,'status'可以是'public'或'draft',我可以向你保证它只保存这两个值中的一个,因为我已经在各个阶段发出警告,无论如何,这里的if语句有效。看看:
function switch_status(status){
if (status == 'public'){
return false;
} if (status == 'draft') {
return true;
}
^这样可行,但用下面的'switch'语句替换'if'不起作用。
switch(status){
case 'public':
return false;
case 'draft':
return true;
}
}
第一个为我提供不可避免的尴尬简单答案的人赢得了我的荣誉!
编辑:这是我的完整代码 -
$('.status').live('click',
function(){
fullClass = $(this).attr('class');
id = fullClass.split(' ').slice(-1);
status = fullClass.split(' ').slice(-2,-1);
var newStatus = switch_status(status);
alert(newStatus);
});
function switch_status(status){
// if (status == 'public'){
// return false;
// } if (status == 'draft') {
// return true;
// }
switch(status){
case 'public':
return false;
case 'draft':
return true;
}
}
答案 0 :(得分:4)
您将status
作为一个字符串的数组(slice
的结果)而不是仅仅作为字符串传递。
当您检查数组和字符串之间的相等性时,似乎强制导致相等性检查起作用。但是在转换声明中不会发生强制行为。
如果我改变
status = fullClass.split(' ').slice(-2,-1);
到
status = fullClass.split(' ').slice(-2,-1)[0];
然后它运作正常。
答案 1 :(得分:1)
我怀疑由于类型转换而出现此问题。
Javascipt通常是一种松散类型的语言。您之前使用的if语句使用了松散的==
比较。这很好用。
但是,switch语句是另一回事。对于匹配的情况,数据类型必须匹配。换句话说,status
必须在传递给switch语句之前转换为字符串。
答案 2 :(得分:0)
我在jquery循环中使用了一个.each并将值与'this'进行了比较;如果我使用console.log,我可以清楚地看到'this'具有正确的值。它在if / else逻辑中工作但在switch / case逻辑中失败。
解决方案是:
var obj = this.toString();
switch(obj){
case 'one': ...
case 'two': ...
}
通过将'this'强制为字符串类型,交换机中的逻辑现在可以正常工作。