[譯]如何更有效的獲取文件擴展名

問:如何獲取文件擴展名?

var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //xsl
getFileExtension(file2); //doc

function getFileExtension(filename) {
  /*TODO*/
}

方案一:正則表達式

function getFileExtension1(filename) {
    return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename)[0] : undefined;
}

方案二:使用Stringsplit方法

function getFileExtension2(filename) {
    return filename.split('.').pop();
}

上述兩種方案沒法覆蓋一些極端狀況,下面這個更健壯javascript

方案三:使用StringslicelastIndexOf方法

function getFileExtension3(filename) {
    return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2);
}

console.log(getFileExtension3(''));                            // ''
console.log(getFileExtension3('filename'));                    // ''
console.log(getFileExtension3('filename.txt'));                // 'txt'   
console.log(getFileExtension3('.hiddenfile'));                 // ''
console.log(getFileExtension3('filename.with.many.dots.ext')); // 'ext'

這貨怎麼工做的?java

  • String.lastIndexOf返回指定值的最後出現位置(本例裏是:.)。若是返回-1,表示沒找到該指定值正則表達式

  • 當參數是filename.hiddenfile時,lastIndexOf的返回值分別是-10。而後無符號移位操做符-2轉成了4294967294-1轉成了4294967295,這個小技巧保證了極端情況下取值也不會異常jsp

  • 而後String.prototype.slice就以上面的計算結果做爲起始下標從原始字符串中提取出了正確的文件擴展名。若是上一步驟計算出的起始下標大於原始字符串長度,則返回''性能

比較

方案 參數 結果
正則表達式 '' undefined
'filename' undefined
'filename.txt' 'txt'
'.hiddenfile' 'hiddenfile'
'filename.with.many.dots.ext' 'ext'
Stringsplit '' ''
'filename' 'filename'
'filename.txt' 'txt'
'.hiddenfile' 'hiddenfile'
'filename.with.many.dots.ext' 'ext'
StringslicelastIndexOf '' ''
'filename' ''
'filename.txt' 'txt'
'.hiddenfile' ''
'filename.with.many.dots.ext' 'ext'

在線演示和性能

上述代碼的線上實例
上述三個方案的性能測試測試

源碼

JavaScript裏若是獲取文件擴展名spa

原文地址:How to get the file extension more efficientlyprototype

相關文章
相關標籤/搜索