带默认值的对象解构:values返回原生函数而非undefined问题咨询
解构赋值中数组与对象的values取值差异解析
先拆解你遇到的问题核心:
当response.data是数组时,解构出来的values是原生函数,这是因为数组的原型链上自带values方法,而你当前的解构逻辑并没有跳过原型链的查找。
具体分析两段代码
第一段代码(data为数组)
const response = { data: [] } const { data: { values } = {} } = response
解构逻辑是:
- 从
response中取出data,此时data是一个数组(存在且不为null/undefined),所以不会使用后面的默认值{}。 - 接着从这个数组中读取
values属性——数组的原型Array.prototype上自带values()迭代器函数,所以这里取到的是这个原生函数,而非undefined。
第二段代码(data为空对象)
const response = { data: {} } const { data: { values } = {} } = response
解构逻辑是:
- 同样先取出
data(空对象,存在),不触发默认值。 - 从空对象读取
values属性——普通对象的原型Object.prototype上没有values实例方法(Object.values()是全局工具方法,不是实例属性),所以找不到对应属性,结果为undefined,符合你的预期。
解决方法
如果希望无论data是数组还是空对象,取不到values时都返回undefined,可以给values本身设置默认值:
const response = { data: [] } const { data: { values = undefined } = {} } = response
这样当data上没有自身的values属性时(数组的values来自原型,不属于自身属性),就会使用默认值undefined。
或者更严谨地只取data自身的values属性:
const response = { data: [] } const { data } = response const values = data.hasOwnProperty('values') ? data.values : undefined
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

