我正在检测扩展,然后根据扩展采取措施。所以我的问题是,为什么这个工作似乎不合逻辑?

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一样,而又不会反复遍历变量?值得关注的是,此列表比扩展数量要大得多,并且说了很多之后就显得很多不必要的代码。

最佳答案

如果ext是ext == 'avi' || 'mpg' || 'mpeg' || 'mp4' || '3gp'avi中的任何一个是truthy,则在比较时,行'mpg' || 'mpeg' || 'mp4' || '3gp'将始终为true。

==运算符仅比较单个变量以供将来参考。

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
}

10-06 14:08