资讯专栏INFORMATION COLUMN

[译]如何更有效的获取文件扩展名

wthee / 233人阅读

摘要:如果上一步骤计算出的起始下标大于原始字符串长度,则返回比较方案参数结果正则表达式的的和在线演示和性能上述代码的线上实例上述三个方案的性能测试源码里如果获取文件扩展名原文地址

问:如何获取文件扩展名?
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();
}

上述两种方案无法覆盖一些极端情况,下面这个更健壮

方案三:使用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"

这货怎么工作的?

String.lastIndexOf返回指定值的最后出现位置(本例里是:.)。如果返回-1,表示没找到该指定值

当参数是filename.hiddenfile时,lastIndexOf的返回值分别是-10。然后无符号移位操作符将-2转成了4294967294-1转成了4294967295,这个小技巧保证了极端状况下取值也不会异常

然后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里如果获取文件扩展名

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79286.html

相关文章

  • 】WebSocket协议第五章——数据帧(Data Framing)

    摘要:概述本文为协议的第五章,本文翻译的主要内容为传输的数据相关内容。注意无论协议是否使用了,帧都需要添加掩码。服务端收到没有添加掩码的数据帧以后,必须立即关闭连接。服务端禁止在发送数据帧给客户端时添加掩码。基础数据帧协议通过进行了正式的定义。 概述 本文为WebSocket协议的第五章,本文翻译的主要内容为WebSocket传输的数据相关内容。 有兴趣了解该文档之前几张内容的同学可以见: ...

    nevermind 评论0 收藏0
  • []Mixin 函数

    摘要:函数通常是面向对象编程风格,具有副作用。因为在函数式编程中,很有可能这些引用指向的并不是同一个对象。记住,函数并不意味着函数式编程。函数可以用函数式编程风格编写,避免副作用并不修改参数,但这并不保证。 软件构建系列 原文链接:Functional Mixins 译者注:在编程中,mixin 类似于一个固有名词,可以理解为混合或混入,通常不进行直译,本文也是同样。 这是软件构建系列教...

    zxhaaa 评论0 收藏0
  • [] 存储和处理时间序列数据(“Time Series Databases”第三章)

    摘要:并且这种格式没有事先对时间序列的数量做任何限制。使用格式来存储时间序列数据的两种可能的。其中存放了时间列序列列和数值列三列。随着数据规模的继续增长,基于的应用程序越来越不适合处理这样规模的时间序列数据了。 就像我们在前一章提到的,一个时间序列是一系列数值,每个数值都伴随着一个时间值,代表数据被记录时的时间。时间序列数据存入后就很少再需要修改了,查询时经常是查询一个连续时间段的数据,也可...

    EastWoodYang 评论0 收藏0

发表评论

0条评论

wthee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<