React异常问题:对象判定为Object类型但调用Object.getOwnPropertyNames时报错
这个问题的核心在于组件渲染时机和Object.getOwnPropertyNames()方法的参数限制,我来一步步拆解:
1. 初始渲染时的object1状态
你的组件初始state里object1被设为null,而componentDidMount是异步执行的——它会在组件第一次渲染完成后才发起API请求,请求完成后才会更新state里的object1。
如果你的那几个console.log语句是在组件的渲染逻辑里(比如render方法内),那么第一次渲染时,object1还是null:
- 执行
console.log(object1)→ 输出null - 执行
console.log(isObject(object1))→null instanceof Object返回false(但你看到的true是组件更新后第二次渲染的输出) - 执行
console.log(Object.getOwnPropertyNames(object1))→ 这里直接触发错误,因为Object.getOwnPropertyNames()要求参数必须是一个对象,不能是null或undefined,浏览器会抛出TypeError: Cannot convert undefined or null to object
2. 为什么只保留前两个console时看起来正常?
当你只保留前两个打印语句时,第一次渲染虽然会输出null和false,但不会抛出错误,组件能正常完成第一次渲染。之后componentDidMount的异步请求完成,更新state触发组件重新渲染,这时候object1已经是你期望的数组对象,第二次执行打印语句就会输出数组和true——你可能只注意到了第二次的输出,忽略了初始渲染的结果。
但加入第三个打印语句后,第一次渲染就直接报错,组件渲染中断,根本没机会走到更新后的重新渲染步骤,所以你只会看到错误。
3. 额外的小问题
你的componentDidMount写法有问题:类组件里的方法应该直接写为async componentDidMount() { ... },而不是用async function componentDidMount()声明,后者会导致this指向错误,可能在后续代码里引发其他问题。
解决办法
在调用Object.getOwnPropertyNames()之前,先判断object1是否有效:
// 方法1:条件判断 if (object1 !== null && object1 !== undefined) { console.log(Object.getOwnPropertyNames(object1)); } // 方法2:使用逻辑与短路求值 console.log(object1 && Object.getOwnPropertyNames(object1));
这样既能在object1有效时打印属性名,也不会在初始渲染时抛出错误。
内容的提问来源于stack exchange,提问作者musi

