[翻訳]ファイルの拡張子をより効果的に取得するにはどうすればいいですか?

2636 ワード

ファイルの拡張子はどうやって取得しますか?
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();
}
上記の二つの案はいくつかの極端な状況をカバーすることができません.これはより丈夫です.
方式3:Stringsliceを使用して、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'
この商品はどうやって働きますか?
  • String.lastIndexOfは、指定値の最後の出現位置を返します..に戻ると、指定値が見つからなかったということです.
  • パラメータが-1filenameの場合、.hiddenfileの戻り値はそれぞれlastIndexOf-1である.その後、符号無しシフト操作器は0-24294967294に変換し、この小技術は極端な状況下で値を取っても異常がないことを保証します.
  • その後、String.prototype.sliceは、上記の計算結果を先頭に、元の文字列から正しいファイル拡張子を抽出した.前のステップで計算された開始アンダースケールが元の文字列長より大きい場合、-1
  • に戻る.
    比較
    シナリオ
    パラメータ
    結果
    正規表現
    ''
    undefined
    'filename'
    undefined
    'filename.txt'
    ‘txt’
    '.hiddenfile'
    'hiddenfile'
    'filename.with.many.dots.ext'
    'ext'4294967295''''
    ''
    'filename'
    'filename'
    'filename.txt'
    ‘txt’
    '.hiddenfile'
    'hiddenfile'
    'filename.with.many.dots.ext'
    'ext'StringsplitString''
    ''
    'filename'
    ''
    'filename.txt'
    ‘txt’
    '.hiddenfile'
    ''
    'filename.with.many.dots.ext'
    'ext'
    オンラインプレゼンテーションとパフォーマンス
    上記コードのオンラインインスタンス上の3つのスキームの性能テスト
    ソース
    JavaScriptでファイルの拡張子を取得すると
    How to get the file etension more efficiently