You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何安全获取对象深层属性值,避免逐层校验?

JavaScript安全获取深层对象属性的简洁方案

有多种比逐层嵌套判断更简洁的方案可以实现需求,常用的方案如下:

方案1:ES2020 可选链操作符(生产环境首选)

这是目前官方原生支持的最简洁写法,可选链操作符?.会在访问路径中出现null/undefined时直接短路返回undefined,不会抛出异常:

// 安全获取属性,中间任意一层不存在也不会报错
const level3Value = object.level1?.level2?.level3
console.log(level3Value) // 属性存在时返回foo,否则返回undefined

如果需要在属性不存在时设置兜底默认值,可以搭配同是ES2020推出的空值合并运算符??使用:

// 仅当属性路径不存在/最终值为undefined/null时,返回兜底默认值
const level3Value = object.level1?.level2?.level3 ?? '默认值'

注意:??和逻辑或||的判定规则不同,||会把0、空字符串''、false这类合法假值也判定为需要替换为默认值,如果你需要保留这类合法假值,请使用??作为兜底运算符。

目前所有现代浏览器、Node.js 14+版本都原生支持这两个运算符,如果你需要兼容更低版本环境,用Babel做语法转译即可正常使用。


方案2:自定义通用工具函数(兼容老旧环境)

如果你的项目不需要引入转译工具,可以自己实现一个通用的深层属性获取函数,一次封装后全局通用:

/**
 * 安全获取对象深层属性
 * @param {object} obj 目标对象
 * @param {string|array} path 属性路径,支持 'a.b.c' 或者 ['a','b','c'] 两种写法
 * @param {any} defaultValue 可选参数,属性不存在时返回的兜底值
 * @returns {any} 属性值或者兜底值
 */
function getDeepProperty(obj, path, defaultValue) {
  const pathArray = Array.isArray(path) ? path : path.split('.')
  let currentValue = obj
  for (const key of pathArray) {
    if (currentValue === null || currentValue === undefined) {
      return defaultValue
    }
    currentValue = currentValue[key]
  }
  return currentValue === undefined ? defaultValue : currentValue
}

// 使用示例
const level3Value = getDeepProperty(object, 'level1.level2.level3', '默认值')

这种写法没有任何语法依赖,可以兼容所有JavaScript运行环境。


内容的提问来源于stack exchange,提问作者alramdein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:09:04