应使用 lastindexof 定位最后一个点再 slice 截取,因 indexof 只找首个点导致多点文件名出错,split('.').pop() 在无扩展名或隐藏文件时返回错误结果;lastindexof 可正确处理 archive.tar.gz、readme、.gitignore 等边界情况。

直接用 lastIndexOf 找最后一个点的位置,再用 slice 截取后面部分,就能准确拿到扩展名,避开文件名里含多个点(比如 archive.tar.gz)的干扰。
为什么不能只用 indexOf 或 split('.').pop()
indexOf 只找第一个点,file.name.txt 会错取成 name.txt;split('.').pop() 在无扩展名(如 README)或纯点开头(如 .gitignore)时也会出错——前者返回空字符串,后者返回 gitignore,完全失真。
核心逻辑:定位最后一个点,再安全截取
先调用 str.lastIndexOf('.')} 得到最后一点的索引,再判断该位置是否有效(不能是开头、也不能是 -1),然后用 slice 提取子串:
- 若索引为
-1,说明没点 → 无扩展名 - 若索引为
0,说明以.开头(如.config)→ 扩展名就是整个字符串(按约定,这是合法的隐藏文件扩展名) - 否则,从
index + 1开始slice到末尾
一行实用写法(带边界处理)
可封装成简洁函数:
const getExt = str => {
const i = str.lastIndexOf('.');
return i === -1 ? '' : str.slice(i + 1);
};
使用示例:
-
getExt('photo.jpeg')→'jpeg' -
getExt('archive.tar.gz')→'gz' -
getExt('README')→'' -
getExt('.gitignore')→'gitignore'
注意大小写与空白字符
原生方法不自动 trim 或转小写。如果业务需要统一格式,建议额外处理:
- 去首尾空格:
str.trim()再查点 - 转小写:
str.slice(i + 1).toLowerCase() - 但不要在查找前就 toLowerCase(),否则会改变原始索引位置(尤其涉及 Unicode 时)










