为何访问card对象的powerfulAgainst数组时出现indexOf未定义错误?
card.powerfulAgainst返回undefined,但console.log(card)却显示该属性存在? 这种情况我之前踩过好几次坑,大概率是下面几个常见原因导致的,我帮你逐一分析:
1. 浏览器控制台的「延迟求值」陷阱
这是最常见的原因!浏览器控制台打印对象时,并不会立刻把对象的所有属性都快照下来,而是保存了一个对象引用。当你在控制台展开对象查看的时候,其实是读取了对象的最新状态——但你执行console.log(card.powerfulAgainst)的那一刻,这个属性可能还没被赋值。
举个例子:
let card = {}; console.log(card); // 控制台展开后可能看到powerfulAgainst属性 console.log(card.powerfulAgainst); // 输出undefined // 之后才赋值 card.powerfulAgainst = ["aaa"];
这时候控制台里的card展开后会显示powerfulAgainst,但实际执行card.powerfulAgainst时它还不存在。
排查方法:打印对象的序列化版本,看当时的真实状态:
console.log(JSON.stringify(card));
如果这个输出里没有powerfulAgainst,就说明当时对象确实没有这个属性。
2. 属性名拼写/大小写不一致
别笑,这种低级错误真的很容易犯!比如控制台里显示的属性是PowerfulAgainst(首字母大写),但你代码里写的是powerfulAgainst;或者属性名里有下划线、空格你没注意到(比如powerful_against)。
排查方法:直接打印对象的所有键,核对拼写:
console.log(Object.keys(card));
看看输出的数组里有没有和你写的powerfulAgainst完全一致的键。
3. card是Proxy代理对象
如果card是被Proxy包装过的对象,直接访问属性时可能会被Proxy的get拦截器影响,导致返回undefined,但控制台打印时会显示原始目标对象的属性。
比如Proxy的get方法没有正确处理powerfulAgainst这个属性:
const target = { powerfulAgainst: ["aaa"] }; const card = new Proxy(target, { get(target, prop) { if (prop !== "name") return undefined; // 只允许访问name属性 return target[prop]; } }); console.log(card); // 展开会看到powerfulAgainst console.log(card.powerfulAgainst); // 输出undefined
排查方法:检查card是否是Proxy:
console.log(card instanceof Proxy);
如果是,去查看Proxy的拦截器逻辑,确认是否正确处理了powerfulAgainst属性的访问。
4. 异步赋值的时序问题
如果card的属性是通过异步操作(比如API请求、定时器、Promise回调)赋值的,那你在异步操作完成前访问card.powerfulAgainst,自然会得到undefined,但控制台打印时异步操作已经完成,所以能看到属性。
比如:
let card = {}; // 模拟异步赋值 setTimeout(() => { card.powerfulAgainst = ["aaa"]; }, 100); console.log(card); // 之后展开会看到属性 console.log(card.powerfulAgainst); // 立刻执行,输出undefined
排查方法:确认你的代码执行顺序,把访问card.powerfulAgainst的逻辑放在赋值完成之后,或者用async/await、Promise回调确保异步操作完成后再访问。
5. 属性是Symbol类型的键
如果powerfulAgainst是用Symbol作为键的属性,那你用.powerfulAgainst是访问不到的,必须用Symbol键来访问。比如:
const powerfulAgainstKey = Symbol("powerfulAgainst"); const card = { [powerfulAgainstKey]: ["aaa"] }; console.log(card); // 控制台会显示Symbol(powerfulAgainst)对应的属性 console.log(card.powerfulAgainst); // 输出undefined console.log(card[powerfulAgainstKey]); // 输出["aaa"]
排查方法:打印对象的所有Symbol键:
console.log(Object.getOwnPropertySymbols(card));
看看是否存在对应的Symbol键。
内容的提问来源于stack exchange,提问作者Nicolás de Ory

