欢迎光临
我们一直在努力

小白前端救命符:用 ES6 链判断和 Null 合并操作符少写 80% 判空代

在这里插入图片描述

小白前端救命符:用 ES6 链判断和 Null 合并操作符少写 80% 判空代

  • 小白前端救命符:用 ES6 链判断和 Null 合并操作符少写 80% 判空代码
    • 先别急着喷,这俩新玩意儿到底能干嘛?
    • 链判断运算符(?.)——“问路”不再被打
      • 1. 拿属性:最深情的“点到为止”
      • 2. 拿数组: index 越界?不存在的
      • 3. 调函数:回调可能不存在?一键护身
      • 4. 动态属性名:括号语法也能玩
    • Null 合并运算符(??)——别把“假值”当空气
    • 组合拳:?. + ?? = 判空终结者
    • 真·项目踩坑实录:别高兴太早
      • 1. 兼容性:IE 直接原地去世
      • 2. 打包工具太旧:升级 webpack 吧少年
      • 3. 别把 `??` 和 `||` 混着乱炖
    • 骚操作加餐:一行代码能玩出多少花?
      • 1. 安全执行回调数组
      • 2. 链式解构 + 默认值
      • 3. 搭配函数参数默认值
      • 4. 与 React Hooks 的梦幻联动
      • 5. 链判断 + 空合并做“短路”赋值
    • 代码可读性:炫技一时爽,review 火葬场
    • 小结:少写 80% 判空不是口号,是日常

小白前端救命符:用 ES6 链判断和 Null 合并操作符少写 80% 判空代码

引子:你还在 if (obj && obj.user && obj.user.name) 吗? 这玩意儿真不是人写的。每天写这种“俄罗斯套娃”式判空,我都怀疑自己是来写代码的还是来练指力的。直到某天,我在某个被产品催命的深夜,终于忍无可忍,对着屏幕吼了一句:“老子不想再写三层 if 了!”——然后,ES2020 的两位亲儿子就蹦出来了:?. 和 ??。从此,我的人生多了一包辣条的幸福感。


先别急着喷,这俩新玩意儿到底能干嘛?

一句话版本: ?. 让你“安全地”拿数据,拿不到就返回 undefined,不报错; ?? 只在“真的是空”时才给你默认值,把 0、false、'' 这些“假值”当亲兄弟。


链判断运算符(?.)——“问路”不再被打

1. 拿属性:最深情的“点到为止”

// 以前
const name = user && user.profile && user.profile.name;

// 现在
const name = user?.profile?.name;

看到没,代码瞬间从“楼梯房”变“电梯房”。 注意:?. 一旦短路,后面整个链条直接返回 undefined,不会继续点下去,更不会抛“Cannot read property xxx of undefined”这种经典灵魂拷问。

2. 拿数组: index 越界?不存在的

// 老写法
const firstTag = post && post.tags && post.tags[0];

// 新写法
const firstTag = post?.tags?.[0];

对,中间那个 ?.[index] 就是“数组版”的链判断,括号里还能放变量:

const idx = 2;
const lucky = post?.tags?.[idx];

3. 调函数:回调可能不存在?一键护身

// 老写法
if (typeof onSuccess === 'function') {
onSuccess(data);
}

// 新写法
onSuccess?.(data);

只要 onSuccess 是 undefined 或者 null,这一句就安安静静地变成“无事发生”,不会给你整“xxx is not a function”的幺蛾子。

4. 动态属性名:括号语法也能玩

const key = 'avatar';
const url = user?.profile?.[key]?.url;

把变量塞进括号里,链判断照样认,香得很。


Null 合并运算符(??)——别把“假值”当空气

先复习一下“旧社会”有多惨:

// 产品说:音量默认 50
const volume = userVolume || 50;

结果用户把音量拖到 0,刷新页面——咦?怎么又变成 50 了? 因为 0 在 || 眼里就是“假值”,直接被踢掉。 ?? 看不下去了:“我只认 null 和 undefined,其他别来碰瓷。”

// 正宗写法
const volume = userVolume ?? 50;

再举几个真香现场:

// 字符串
const nickname = rawName ?? '匿名大侠';

// 布尔
const enabled = featureFlag ?? true;

// 数字
const pageSize = limit ?? 20;


组合拳:?. + ?? = 判空终结者

场景 1:后端返回的嵌套 JSON,鬼知道哪层会失踪。

// 老代码
let url;
if (res && res.data && res.data.user && res.data.user.avatar) {
url = res.data.user.avatar.url;
} else {
url = 'default.png';
}

// 新代码
const url = res?.data?.user?.avatar?.url ?? 'default.png';

一行,搞定。产品经理在旁边看你敲代码,都怀疑你偷偷开了外挂。

场景 2:Vue 组件里取 props 的默认值。

export default {
props: {
config: Object
},
computed: {
theme() {
return this.config?.ui?.theme ?? 'light';
}
}
}

场景 3:Pinia 里读深层状态,再给个兜底。

import { useAppStore } from '@/stores/app';
const appStore = useAppStore();

// 旧写法
let count = 0;
if (appStore.stat && appStore.stat.pageViews) {
count = appStore.stat.pageViews;
}

// 新写法
const count = appStore.stat?.pageViews ?? 0;


真·项目踩坑实录:别高兴太早

1. 兼容性:IE 直接原地去世

?. 和 ?? 都是 ES2020 的语法,IE 全系列不支持。 如果项目还得陪 IE 养老,乖乖开 Babel:

npm i @babel/plugin-proposal-optional-chaining \\
@babel/plugin-proposal-nullish-coalescing -D

babel.config.js 里加两行:

module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
'@babel/plugin-proposal-optional-chaining',
'@babel/plugin-proposal-nullish-coalescing'
]
};

2. 打包工具太旧:升级 webpack 吧少年

webpack 4 默认的 acorn 版本解析不了新语法, 报错“Support for the experimental syntax ‘xxx’ isn’t currently enabled”。 别挣扎,直接 webpack 5 安排,或者把 acorn 升到 8+。

3. 别把 ?? 和 || 混着乱炖

const a = 0;
const b = a || 100; // b === 100
const c = a ?? 100; // c === 0

写完顺手 console.log 一下,别让 0 凭空蒸发,否则测试妹妹提 bug 的时候,你百口莫辩。


骚操作加餐:一行代码能玩出多少花?

1. 安全执行回调数组

callbacks?.forEach(cb => cb?.(data));

2. 链式解构 + 默认值

const { a: { b: { c } = {} } = {} } = obj ?? {};

虽然看起来有点“炫技”,但在配置合并场景里真香。

3. 搭配函数参数默认值

function fetchUser(id, options = {}) {
const apiRoot = options.apiRoot ?? 'https://api.xxx.com';
const timeout = options.timeout ?? 5000;
// …
}

4. 与 React Hooks 的梦幻联动

const { data } = useSWR('/api/user', fetcher);
const avatar = data?.user?.profile?.avatar ?? '/default-avatar.png';

5. 链判断 + 空合并做“短路”赋值

// 只当 localStorage 里真没值时才初始化
const cached = JSON.parse(localStorage.getItem('conf') ?? '{}');
const theme = cached?.theme ?? 'dark';
localStorage.setItem('conf', JSON.stringify({ theme }));


代码可读性:炫技一时爽,review 火葬场

?. 能写多长? a?.b?.c?.[key]?.(arg1, arg2)?.value ?? defaultValue 一行 80 列都塞不下。 你当时觉得自己是“代码诗人”,过两周再看: “这写的是个啥?为什么不拆成两句?” 所以,江湖规矩:

  • 链条超过 3 层,考虑拆变量;
  • 逻辑复杂,老老实实写 if;
  • 写完后默念三遍:“同事不是编译器。”

小结:少写 80% 判空不是口号,是日常

自从把 ?. 和 ?? 纳入日常武器库,我统计了一下: 一个中等复杂度的后台系统,判空相关代码从 2400 行干到 400 行出头, PR 评审里“空指针”类 bug 直接清零, 测试妹妹再也不在我耳边循环播放“你又没判空”。

所以,兄弟,别犹豫了, 今天就把 ?. 和 ?? 安排上, 让“套娃判空”成为历史, 把省下来的时间拿去摸鱼—— 或者,给老板多画几个大饼,它不香吗?

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:DTcode7的博客首页。 一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


专栏系列(点击解锁)学习路线(点击解锁)知识定位
《微信小程序相关博客》 持续更新中~ 结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
《AIGC相关博客》 持续更新中~ AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
《HTML网站开发相关》 《前端基础入门三大核心之html相关博客》 前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识
《前端基础入门三大核心之JS相关博客》 前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心
《前端基础入门三大核心之CSS相关博客》 介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页
《canvas绘图相关博客》 Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化
《Vue实战相关博客》 持续更新中~ 详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅
《python相关博客》 持续更新中~ Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具
《sql数据库相关博客》 持续更新中~ SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能
《算法系列相关博客》 持续更新中~ 算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维
《IT信息技术相关博客》 持续更新中~ 作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识
《信息化人员基础技能知识相关博客》 无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方
《信息化技能面试宝典相关博客》 涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面
《前端开发习惯与小技巧相关博客》 持续更新中~ 罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
《photoshop相关博客》 持续更新中~ 基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
日常开发&办公&生产【实用工具】分享相关博客》 持续更新中~ 分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤 非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 小白前端救命符:用 ES6 链判断和 Null 合并操作符少写 80% 判空代
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址