我正在检测扩展程序,然后根据扩展程序执行操作。所以我的问题是为什么这不起作用,似乎合乎逻辑呃?
var ext = url.split('.').pop().toLowerCase();
if (ext == 'avi' || 'mpg' || 'mpeg' || 'mp4' || '3gp') {
This is a video (this always returns true...?)
} else if (ext == 'jpg' || 'jpeg' || 'gif' || 'png' || 'bmp') {
This is a picture
} else {
This extension isn't supported here
}
但是这样呢?不必要的开销?
var ext = url.split('.').pop().toLowerCase();
if (ext == 'avi' || ext == 'mpg' || ext == 'mpeg' || ext == 'mp4') {
This is a video
} else if (ext == 'jpg' || ext == 'jpeg' || ext == 'gif' || ext == 'png') {
This is a picture
} else {
This extension isn't supported here
}
是否存在语法问题我缺少使这个工作像示例1一样不反复变换?值得关注的是,这个列表比图片中的扩展数量大得多,并且在完成所有操作时似乎是很多不必要的代码。
答案 0 :(得分:3)
如果您正在比较ext是ext == 'avi' || 'mpg' || 'mpeg' || 'mp4' || '3gp'
还是avi
中的任何一个truthy,则行'mpg' || 'mpeg' || 'mp4' || '3gp'
将始终为真。
==
运算符仅比较单个变量以供将来参考。
您可以使用switch
编写此比较的另一种方法如下:
switch(ext) {//switch with fall throughs
case 'avi':
case 'mpg':
case 'mpeg':
case 'mp4':
//we got a video
break;
case 'jpg':
case 'jpeg':
case 'gif':
case 'png':
//its a picture
break;
default:
//this extension isn't suupported
}
答案 1 :(得分:1)
“所以我的问题是为什么这不起作用”
因为那不是||
operator所做的。
我能想到实现你的概念的最短语法是对每个条件使用正则表达式测试:
if (/^(avi|mpg|mpeg|mp4|3gp)$/.test(ext)) {
或者您可以使用数组:
if (['avi', 'mpg', 'mpeg', 'mp4', '3gp'].indexOf(ext) != -1) {
(假设您并不担心IE< = 8,或者正在使用a shim,或者使用jQuery的$.inArray()
代替.indexOf()
。)
或者这似乎是使用switch
声明的显而易见的地方:
var ext = url.split('.').pop().toLowerCase();
switch(ext) {
case 'avi':
case 'mpg':
case 'mpeg':
case 'mp4':
case '3gp':
// This is a video (this always returns true...?)
break;
case 'jpg':
case 'jpeg':
case 'gif':
case 'png':
case 'bmp':
// This is a picture
break;
default:
// This extension isn't supported here
break;
}
答案 2 :(得分:1)
您首先if
条件总是真的。
如果你有很多值要检查,那么我建议像
var video = ['avi', 'mpg'];
var audio = ['mpg', 'mpeg'];
if($.inArray(ext, video)){
//video
} if($.inArray(ext, audio)){
//audio
} else {
}