当前位置: 首页 > 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

相关文章:

  • 牛客——暴力、技巧、字符与数组的使用(强强联合、字符数量)
  • 【工具】解析URL获取实际图片地址下载原始FFHQ图像
  • C++:实现线程池
  • VMware中虚拟机和主机的SSH远程连接
  • langchain使用推理模型如DeepSeek,删除回答中的推理过程<think></think>
  • 数据库实验10 函数存储
  • vitepress 复杂环境引入 mermaid
  • Python技巧:TX串口输入十六进制字符串,并获取输出,RX获取输出;循环1000次,通过分析RX输出,计算丢包率。
  • 使用docker配置Mysql
  • 深度学习:图神经网络GNN、GCN及其在推荐系统的应用
  • 人工智能 计算智能领域中分布估计算法的核心思想
  • 影刀RPA中使用AI模型
  • 【PhysUnits】1 SI Prefixes 实现解析(prefix.rs)
  • 常识补充(NVIDIA NVLink技术:打破GPU通信瓶颈的革命性互联技术)
  • 前端基础之《Vue(14)—组件通信》
  • 【LLM】什么是 MCPACPACA
  • 塔能水泵节能方案:精准驱动工厂能耗优化
  • 5.6刷题并查集
  • opencv实战:银行卡卡号识别
  • 即插即用!长安汽车复旦提出LMPOcc:长期记忆先验实现占用预测任务新SOTA
  • 售卖自制外挂交易额超百万元,一男子因提供入侵计算机系统程序被抓
  • 正荣地产:公司控股股东已获委任联合清盘人
  • 1101名优秀运动员拟保送,全红婵、黄雨婷、盛李豪在列
  • 五一小长假上海“人从众”,全要素旅游交易总额超200亿元
  • 巴基斯坦宣布禁止印度船只入港
  • 江西望仙谷回应“游客凌晨等不到接驳车”:已限流,接驳车运行时间延长