JavaScript split()方法为何给字符串加 ? 的作用是什么?
问题
我尝试利用获取的数据创建数组并生成新的Set对象,但发现生成的字符串末尾带有\r。相关代码如下:
export const WordSetFn = async () =>{ let wordSet; await fetch(wordsSet).then((resp) => resp.text() ).then((resp) =>{ const wordSetArray = resp.split("\n") wordSet = new Set(wordSetArray) }) return {wordSet}; } // word set would look like this: {"above\r",...}
我获取数据的TXT文件内容为每行一个单词,格式如下:
aback abase abate abbey abbot abhor abide abled abode abort ...
想请教:为何split()处理后字符串末尾会出现\r?\r具体有什么作用?
解答
为什么会出现\r?
你的TXT文件应该是在Windows系统下创建的——Windows里的换行标记是**\r\n**(回车+换行),而你用split("\n")分割字符串时,只会把\n作为分割符,\r就会留在每个单词的末尾,导致出现类似"above\r"的结果。
\r是什么,有什么作用?
\r是回车符(Carriage Return),最早起源于老式打字机:按下回车按键,打印头会回到当前行的开头位置;而\n是换行符(Line Feed),作用是让纸张向下滚动一行。
到了现代操作系统,不同平台的换行标准有差异:
- Windows系统沿用
\r\n作为换行标记 - Unix/Linux/macOS系统只用
\n - 早期的Mac系统只用
\r
解决方法
有两种简单的处理方式:
- 用正则表达式兼容所有换行格式,分割时匹配
\r可选的情况:
const wordSetArray = resp.split(/\r?\n/)
- 分割后对每个单词做去空白处理,去掉末尾的
\r和可能的其他空白字符:
const wordSetArray = resp.split("\n").map(word => word.trim())
注意:如果单词本身前后有需要保留的空白字符,优先用第一种方法更稳妥。
内容的提问来源于stack exchange,提问作者mutedJunior
相关产品推荐
相关产品推荐

