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; }
String
的split
方法function getFileExtension2(filename) { return filename.split('.').pop(); }
上述兩種方案沒法覆蓋一些極端狀況,下面這個更健壯javascript
String
的slice
,lastIndexOf
方法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
的返回值分別是-1
和0
。而後無符號移位操做符將-2
轉成了4294967294
、-1
轉成了4294967295
,這個小技巧保證了極端情況下取值也不會異常jsp
而後String.prototype.slice就以上面的計算結果做爲起始下標從原始字符串中提取出了正確的文件擴展名。若是上一步驟計算出的起始下標大於原始字符串長度,則返回''
性能
方案 | 參數 | 結果 |
---|---|---|
正則表達式 | '' | undefined |
'filename' | undefined | |
'filename.txt' | 'txt' | |
'.hiddenfile' | 'hiddenfile' | |
'filename.with.many.dots.ext' | 'ext' | |
String 的split |
'' | '' |
'filename' | 'filename' | |
'filename.txt' | 'txt' | |
'.hiddenfile' | 'hiddenfile' | |
'filename.with.many.dots.ext' | 'ext' | |
String 的slice 和lastIndexOf |
'' | '' |
'filename' | '' | |
'filename.txt' | 'txt' | |
'.hiddenfile' | '' | |
'filename.with.many.dots.ext' | 'ext' |
原文地址:How to get the file extension more efficientlyprototype