稀土掘金技术社区 2024年11月27日
离谱,split方法的设计缺陷居然导致了生产bug!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文通过作者的一次生产事故,详细介绍了JavaScript中split()方法的使用,并总结了在使用过程中可能遇到的几个容易忽略的坑,例如split分割空字符串会返回包含空字符串的数组,连续分隔符会导致数组中出现多个空字符串,以及分割Unicode字符时可能出现的问题。文章还提供了相应的解决方案,例如使用filter(Boolean)过滤掉空字符串,以及使用Array.from()方法正确分割Unicode字符。通过学习本文,开发者可以更好地理解和应用split()方法,避免在实际开发中出现类似的错误,提升代码质量和稳定性。

🤔**split方法的基本用法:**split()方法用于将字符串按照指定的分隔符分割成数组,可以指定分隔符为字符串或正则表达式,还可以使用limit参数限制返回数组的最大长度。

⚠️**split分割空字符串的问题:**当split方法遇到空字符串时,会返回一个包含一个空字符串的数组,这可能导致程序错误。解决方案是使用filter(Boolean)过滤掉空字符串。

⚠️**连续分隔符导致空字符串:**如果字符串中存在连续的分隔符,split方法会将它们之间的部分分割为空字符串,导致数组中存在多个空字符串。解决方案同样是使用filter(Boolean)过滤掉空字符串。

⚠️**分割Unicode字符的问题:**split('')方法按字节分割,无法正确识别组合型字符。解决方案是使用Array.from()方法完整分割Unicode字符。

原创 石小石Orz 2024-11-27 08:30 重庆

点击关注公众号,“技术干货”及时达!

点击关注公众号,“技术干货” 及时达!

需求简介

大家好,我是石小石!前几天实现了这样一个需求:

根据后端「images」字段返回的图片字符,提取图片「key」查找图片链接并渲染。

由于后端返回的是用「逗号分隔」的字符,所以获取图片的key使用「split方法」非常方便。

if(data.images != null || data.images != undefined){  
  // 将字符通过split方法分割成数组
  const picKeyList = data.images.split(",")  
  picKeyList.forEach(key => {
    // 通过图片key查询图片链接
    // ...  })  }

乍一看,代码并没有问题,qa同学在测试环境也验证了没有问题!于是,当晚,我们就推送生产了。

几天后的一个晚上,我已经睡觉了,突然接到领导的紧急电话,说我开发的页面加载图片后白屏了!来不及穿衣服,我赶紧去排查bug。

通过断点排查,发现当后端返回的data.images是空字符“""”时,用split分割空字符,得到的picKeyList结果是 “[""]” ,这导致picKeyList遍历时,内部的 「key是空,程序执行错误」

然后我用控制台验证了一下split分割空字符,我人傻了。

后来,我也成功的为这次生产事故背锅。我也无可争辩,是我没完全搞懂split方法的作用机制。

「ps:宝宝心里苦,为什么后端不直接返回图片的key数组!!为什么!!」

吃一堑,长一智,我决定在复习一下「split方法的使用」,并梳理它的「踩坑点」及可能得解决方案。

语法

split() 用于将字符串按照指定分隔符分割成数组

string.split(separator, limit)

基本用法

使用字符串作为分隔符

const text = "苹果,华为,小米";
const result = text.split(","); 
console.log(result); 
// 输出: ['苹果', '华为', '小米']

使用正则表达式作为分隔符

const text = "苹果,华为,小米";
const result = text.split(/[,; ]+/); // 匹配逗号、分号或空格
console.log(result); 
// 输出: ['苹果', '华为', '小米']

使用限制参数

const text = "苹果,华为,小米";
const result = text.split(","2); 
console.log(result); 
// 输出: ['苹果', '华为'] (限制数组长度为 2)

没有找到分隔符

const text = "hello";
const result = text.split(","); 
console.log(result); 
// 输出: ['hello'] (原字符串直接返回)

空字符串的分割

const result = "".split(",");console.log(result);// 输出: [''] (非空数组,包含一个空字符串)

「原因:」
空字符串没有内容,split() 默认返回一个数组,包含原始字符串。

「解决方案:」

const result = "".split(",").filter(Boolean);
console.log(result);
// 输出: [] (使用 filter 移除空字符串)

多余分隔符

const text = ",,苹果,,华为,,";
const result = text.split(",");
console.log(result);
// 输出: ['', '', '苹果', '', '华为', '', '']

「原因:」
连续的分隔符会在数组中插入空字符串。

「解决方案:」

const text = ",,苹果,,华为,,";
const result = text.split(",").filter(Boolean);
console.log(result);
// 输出: ['苹果','华为']

filter(Boolean) 是一个非常常用的技巧,用于「过滤掉数组中的假值」

分割 Unicode 字符

const text = "???‍?‍?";
const result = text.split('');
console.log(result);
// 输出: ['?', '?', '?', '‍', '?', '‍', '?']

「原因:」
split("") 按字节分割,无法正确识别组合型字符。

「解决方案:」

const text = "???‍?‍?";
const result = Array.from(text);
console.log(result);
// 输出: ['?', '?', '?‍?‍?'] (完整分割)

这篇文章通过本人的生产事故,向介绍了split方法使用可能存在的一些容易忽略的bug,希望大家能有所收获。「一定要注意split分割空字符会得到一个包含空字符数组的问题」

点击关注公众号,“技术干货” 及时达!

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

JavaScript split 字符串分割 生产事故 bug
相关文章