取个对象值导致系统崩溃

取个对象值导致系统崩溃

前言

想必各位小伙经常在项目中遇到一些错误,取对象值的时候,经常报错,又或者某些项目突然就经常都是出现在一些对象取值上面,然后就被领导一顿训斥

报错分析

例如: 下面这个报错大家想必不会陌生,就是读取不存在对象的变量

复制代码
Uncaught TypeError: Cannot read properties of undefined (reading 'b')

那么为什么我们会遇到这个问题呢?

下面复现以下场景

假设: 服务端给我们返回一个列表数据,如下

复制代码
[
    {
        title: '新闻信息1',
        info: {
            content: '新闻内容1',
            createTime: '2023-8-12 09:54:42'
        }
    },
    {
        title: '新闻信息2',
        info: {
            content: '新闻内容2',
            createTime: '2023-8-12 09:54:42'
        }
    },
    {
        title: '新闻信息3',
        info: {
            content: '新闻内容3',
            createTime: '2023-8-12 09:54:42'
        }
    }
]

那么前端循环就是这样

复制代码
<ul>
    <li class="li" v-for="(item, index) in list" :key="index">
        <div class="title">{{ item.title }}</div>
        <div class="content">{{ item.info.content }}</div>
    </li>
</ul>

目前看是不是没有问题,但是正常情况下也是不会报错

此时我们修改一下,list里的某个数据, 例如: 某个info为 null 或者 undefined

复制代码
{
    title: '新闻信息3',
    info: null
}

那么此时我们就收到报错

这个报错很容易定位,也容易修改,但是要是在线上出现这样子的问题,就是系统崩溃

那么我们应该用什么办法避免这种问题?

解决方案

目前来看这种对象里取属性的场景,在代码开发过程中是很常见的,那么我们写代码有哪几种快捷的方式?来处理这种问题?

第一种 通过 && 判断对象是否存在,在读取值

复制代码
{{ item.info && item.info.content }} // 先判断 item.info 是否存在  存在则读取content否则不是读取

第二种 v-if 与 第一种方法类似

复制代码
<div class="content" v-if="item.info">{{ item.info.content }}</div> // 通过v-if判断在info存在再渲染元素

第三种 ?. 可选链运算符 当引用的对象为null或者undefined不会引起报错,返回undefined

第三种也是我最推荐一种,代码量最少,最便捷

复制代码
<div class="content">{{ item.info?.content }}</div>

目前我能想到的方法就这几种,不知道还有没有更好方式

总结

虽然这种错误不一定是前端的问题,但是代码的健壮性还是很重要的,个人目前也业务中就经常遇到这样子的问题,服务端返回的某些对象在没有值的情况下就是null,所以导致前端代码报错。

总结

虽然这种错误不一定是前端的问题,但是代码的健壮性还是很重要的,个人目前也业务中就经常遇到这样子的问题,服务端返回的某些对象在没有值的情况下就是null,所以导致前端代码报错。

都是血的教训,希望大家少遇到这样子的错误

相关推荐
xjt_09015 分钟前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农17 分钟前
Vue 2.3
前端·javascript·vue.js
夜郎king42 分钟前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳1 小时前
JavaScript 的宏任务和微任务
javascript
夏幻灵2 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_2 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝2 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions2 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法