取个对象值导致系统崩溃

取个对象值导致系统崩溃

前言

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

报错分析

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

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

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

下面复现以下场景

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

yaml 复制代码
[
    {
        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'
        }
    }
]

那么前端循环就是这样

xml 复制代码
<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

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

那么此时我们就收到报错

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

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

解决方案

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

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

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

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

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

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

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

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

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

总结

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

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

相关推荐
旺旺大力包10 分钟前
【 Git 】git 的安装和使用
前端·笔记·git
PP东15 分钟前
ES学习class类用法(十一)
javascript·学习
海威的技术博客19 分钟前
JS中的原型与原型链
开发语言·javascript·原型模式
雪落满地香26 分钟前
前端:改变鼠标点击物体的颜色
前端
余生H1 小时前
前端Python应用指南(二)深入Flask:理解Flask的应用结构与模块化设计
前端·后端·python·flask·全栈
outstanding木槿1 小时前
JS中for循环里的ajax请求不数据
前端·javascript·react.js·ajax
酥饼~1 小时前
html固定头和第一列简单例子
前端·javascript·html
一只不会编程的猫1 小时前
高德地图自定义折线矢量图形
前端·vue.js·vue
所以经济危机就是没有新技术拉动增长了1 小时前
二、javascript的进阶知识
开发语言·javascript·ecmascript
m0_748250931 小时前
html 通用错误页面
前端·html