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

使用JavaScript空值合并运算符意外返回原生函数,求原因排查

问题原因

你遇到的问题本质是两个核心点:

  • storedKeys是数组实例:你预期storedKeys要么是数组,要么是带keys数组属性的对象,但实际上storedKeys本身就是数组。数组原型Array.prototype上自带原生的keys()方法(用于生成数组键的迭代器),所以storedKeys.keys拿到的是这个原生函数,而非你预想的自定义属性。
  • 空值合并运算符的触发逻辑:??仅在左侧值为null或undefined时,才会返回右侧值。但storedKeys.keys是一个存在的函数(既不是null也不是undefined),因此运算符直接返回了这个函数,没有触发右侧的storedKeys。
修复方法

如果你想要的逻辑是:优先使用storedKeys自身的keys属性(如果存在),否则直接使用storedKeys本身,需要先判断该属性是否属于对象自身(而非原型链继承的)。可以这样修改代码:

const storedKeys = await getStoreKeys();

// 检查是否存在自身的keys属性,是则用它,否则用storedKeys
let keys = storedKeys.hasOwnProperty('keys') ? storedKeys.keys : storedKeys;
console.log(keys);

或者结合可选链与空值合并,同时规避原型方法的干扰:

const storedKeys = await getStoreKeys();

// 仅当keys是自身属性且有效时才使用,否则回退到storedKeys
let keys = (Object.prototype.hasOwnProperty.call(storedKeys, 'keys') && storedKeys.keys) ?? storedKeys;
console.log(keys);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:27:17