这篇文章给大家分享的是有关javascript提高前端代码强大的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
在过去的开发经历中处理了各种奇葩错误,认识到代码健壮性(鲁棒性)是提高工作效率,生活质量的一个重要指标,本文主要整理了提高代码健壮性的一些思考。
之前整理过关于代码健壮性相关的文章
- <李>正儿八经地写javascript之单元测试李> <>李如何在代码中打日志李>
本文将继续探究除了单元测试,打日志之外其余一些帮助提高javascript代码健壮性的方法。
更安全地访问对象
不要相信接口数据
不要相信前端传的参数,也不要信任后台返回的数据
比如某个<代码> api/xxx/列表> 代码的接口,按照文档的约定
{ 代码:0, 味精:““, 数据:[//咛迨? ), };复制代码
前端代码可能就会写成
const{代码、味精、数据}=等待fetchList () data.forEach(()=在{})复制代码
因为我们假设了后台返回的数据是一个数组,所以直接使用了<代码> data.forEach> 代码,如果在联调的时候遗漏了一些异常情况
- <李>预期在没有数据时数据会返回<代码>[]代码>空数组,但后台的实现却是不返回<代码> 代码>字数据段李> <李>后续接口更新,数据从数组变成了一个字典,跟前端同步不及时李>
这些时候,使用<代码>数据。forEach> 代码时就会报错,
未捕获TypeError:数据。forEach不是一个函数
引用>所以在这些直接使用后台接口返回值的地方,最好添加类型检测
Array.isArray(数据),,data.forEach(()=在{})复制代码同理,后台在处理前端请求参数时,也应当进行相关的类型检测。
空值合并运算符
由于JavaScript动态特性,我们在查询对象某个属性时如<代码> x.y。z> 代码,最好检测一下x <代码> 代码>和<代码> y 代码>是否存在
让z=x,,x。y,和x.y。z复制代码经常这么写就显得十分麻烦,飞镖中安全访问对象属性就简单得多
var z=? .y ?还是z;复制代码在ES2020中提出了<强>空值合并运算符>强劲的草案,包括<代码> ? ? 代码>和<代码> ?。代码>运算符,可以实现与飞镖相同的安全访问对象属性的功能。目前打开最新版Chrome就可以进行测试了
在此之前,我们可以封装一个安全获取对象属性的方法
函数getObjectValueByKeyStr (obj,关键,defaultVal=未定义){如果(!键)返回defaultVal;让名称空间=key.toString () .split (“!”);我们的价值, 我=0, len=namespace.length;(;我& lt;兰;我+ +){ 值=https://www.yisu.com/zixun/obj名称空间[[我]];如果(值===定义| |值===null)返回defaultVal; obj=价值; }返回值; }var x={y: {z: 100}}; var val=getObjectValueByKeyStr (x, y.z ");//var val=getObjectValueByKeyStr (x,“zz”); console.log (val);复制代码前端不可避免地要跟各种各种浏览器,各种设备打交道,一个非常重要的问题就是<强>兼容性>强,尤其是目前我们已经习惯了使用ES2015的特性来开发代码,<代码> polyfill> 代码可以帮助解决我们大部分问题。
记得异常处理
参考:
<李> JS错误处理MDN李> <李> JS构建ui的统一异常处理方案,这个系列的文章写得非常好李>
异常处理是代码健壮性的首要保障,关于异常处理有两个方面
<李>合适的错误处理可以提要用户体验,在代码出错时优雅地提示用户李> <>李将错误处理进行封装,可以减少开发量,将错误处理与代码解耦李>
错误对象
可以通过把语句抛出一个自定义错误对象
//创建一个对象类型UserExceptionfunction UserException(消息){//包含消息和名称两个属性 this.message=消息;this.name=癠serException"; }//覆盖默认(对象对象)的toStringUserException.prototype。toString=function(){返回this.name + & # 39;:“& # 39;+。消息+ & # 39;“& # 39; }//抛出自定义错误函数f(){{尝试把新的UserException(“价值也引起); }捕捉(e){如果(e instanceof UserException) {console.log(& # 39;抓住UserException& # 39;) console.log (e) 其他}{console.log(& # 39;未知错误# 39;)把e } 最后}{//可以做一些退出操作,如关闭文件,关闭加载等状态重置 console.log(& # 39;完成# 39;)返回1000//如果终于中了返回值,那么会覆盖前面或查明中的返回值或异常 } } f()复制代码javascript提高前端代码强大的案例分析