离谱,split方法的设计缺陷居然导致了生产bug!

需求简介

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

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

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

js 复制代码
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方法的使用 ,并梳理它的踩坑点及可能得解决方案。

语法

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

js 复制代码
string.split(separator, limit)
  • separator(可选):指定分隔符,可以是字符串或正则表达式。如果省略,则返回整个字符串作为数组。
  • limit(可选):整数,限制返回的数组的最大长度。如果超过限制,多余的部分将被忽略。

基本用法

使用字符串作为分隔符

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

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

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

使用限制参数

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

没有找到分隔符

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

split方法常见踩坑点

空字符串的分割

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

原因:

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

解决方案:

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

多余分隔符

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

原因:

连续的分隔符会在数组中插入空字符串。

解决方案:

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

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

分割 Unicode 字符

js 复制代码
const text = "👍😊👨‍👩‍👦";
const result = text.split('');
console.log(result);
// 输出: ['👍', '😊', '👨', '‍', '👩', '‍', '👦']

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

解决方案:

js 复制代码
const text = "👍😊👨‍👩‍👦";
const result = Array.from(text);
console.log(result);
// 输出: ['👍', '😊', '👨‍👩‍👦'] (完整分割)

总结

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

相关推荐
陈随易7 分钟前
Rust、Golang、MoonBit 编译成 WASM,体积和速度差距有多大?
前端·后端·程序员
IT_陈寒10 分钟前
Python多线程的坑,我居然现在才踩到
前端·人工智能·后端
摇滚侠16 分钟前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
触底反弹1 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
触底反弹1 小时前
AI Tool Use 深度解析:大模型是如何"突破物理限制"调用外部工具的?
javascript·人工智能·后端
竹林8181 小时前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
工业HMI实战笔记2 小时前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互
优雅格子衫2 小时前
TypeScript 类的基本使用小结
javascript·ubuntu·typescript
橘子星2 小时前
从零手写 RAG 语义检索:基于 Node.js 实现轻量级向量搜索
javascript·人工智能
林希_Rachel_傻希希2 小时前
web性能优化之————图片效果
前端·javascript·面试