当前位置: 首页 > news >正文

使用原生javascript手动实现一个可选链运算符

前言

在ES2020标准里面有一个可选链运算符,比如一个obj={};  如果直接使用obj.a.b就会在控制台报错,而使用obj?.a?.b的返回结果为undefined并且不会报错;这是因为如果引用是空值(null 或 undefined),它不会导致错误,而是使表达式短路并返回 undefined

问题

最近遇到一个面试题,要求实现可选链运算符的效果并且如果返回值为null或者undefined要支持用默认值代替,示例代码如下:

// 示例:
// obj: 传入的对象
// path: 传入字符串
// defaultValue: 默认值
function getNestedProp(obj, path, defaultValue) {}const o = {a: {b: {c: 10,},d: [{e: true,},],f: null,},
};console.log(getNestedProp(o, "a.b.c")); // 10
console.log(getNestedProp(o, "a.d.0.e")); // true
console.log(getNestedProp(o, "a.d[0].e")); // false
console.log(getNestedProp(o, "a.c.b")); // undefined
console.log(getNestedProp(o, "a.c.b", 1)); // 1
console.log(getNestedProp(o, "a.f.e", 1)); // 1

解决方案

1.首先要将字符串path转化成数组

2.然后遍历数组,把数组中的每一项和obj进行匹配,如果是null 或 undefined, 则返回defaultValue;

3.如果不是null 或 undefined, 我们就需要最新赋值的对象跟数组的下一个索引项重新来匹配;

具体代码如下:

function getNestedProp(obj, path, defaultValue) {const keys = path.split(".");let current = obj;for (const key of keys) {if (current === null || current === undefined) {return defaultValue;}current = current[key];}return current;
}const o = {a: {b: {c: 10,},d: [{e: true,},],f: null,},
};console.log(getNestedProp(o, "a.b.c")); // 10
console.log(getNestedProp(o, "a.d.0.e")); // true
console.log(getNestedProp(o, "a.d[0].e")); // false
console.log(getNestedProp(o, "a.c.b")); // undefined
console.log(getNestedProp(o, "a.c.b", 1)); // 1
console.log(getNestedProp(o, "a.f.e", 1)); // 1

http://www.xdnf.cn/news/304471.html

相关文章:

  • [论文阅读]MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System
  • 【Spring Boot 注解】@Configuration与@AutoConfiguration
  • vue2项目中使用pag格式动图
  • GMRES算法处理多个右端项的Block与PseudoBlock变体
  • 【已解决】Neo4j Desktop打不开,不断网解决
  • 一种基于条件生成对抗网络(cGAN)的CT重建算法
  • Hadoop架构再探讨
  • keil+vscode+腾讯ai助手
  • 【prometheus+Grafana篇】基于Prometheus+Grafana实现Linux操作系统的监控与可视化
  • 【程序员AI入门:基础】5.提示工程怎么释放LLM的潜力
  • WT2606B显示驱动TFT语音芯片IC:重塑电子锁交互体验的技术革新
  • 神经网络之训练的艺术:反向传播与常见问题解决之道
  • 数据库实验10 函数存储
  • Dify - Stable Diffusion
  • 《数据分析与可视化》(清华)ch-6 作业 三、绘图题
  • 解决Centos连不上网
  • 数字图像相关法在薄板变形测量中的实践
  • 《Python星球日记》第34天:Web 安全基础
  • Cadence学习笔记之---PCB工程创建、类与子类、颜色管理器介绍
  • 【Python】--实现多进程
  • 2.4线性方程组
  • 使用batch脚本调用另一个batch脚本遇到的问题
  • 【Linux网络编程十一】网络原理之数据链路层
  • 【HTML5】显示-隐藏法 实现网页轮播图效果
  • 【LDM】视觉自回归建模:通过Next-Scale预测生成可扩展图像(NeurIPS2024最佳论文阅读笔记与吃瓜)
  • 第七节:图像基本操作-图像属性获取 (尺寸、通道数、数据类型)
  • C++【STL】(1)string
  • 基于STM32、HAL库的W25X40CLSNIG NOR FLASH存储器驱动应用程序设计
  • 【Linux系统】线程安全
  • unix 详解