无法读取未定义的属性(读取 ‘forEach’)
TypeError: Cannot read property ‘forEach’ of Undefined in JS
forEach()
在值上调用该方法时会发生“无法读取未定义的属性(读取 ‘forEach’)”错误undefined
。
要解决该错误,请确保仅forEach
在数组、Set 或 Map 对象上调用该方法。
下面是错误如何发生的示例。
const arr = undefined; // ⛔️ TypeError: Cannot read properties of undefined (reading 'forEach') arr.forEach(element => { console.log(element); });
我们forEach
在一个undefined
值上调用了该方法,因此发生了错误。
将变量初始化为空数组
解决该错误的一种方法是使用逻辑或 (||) 运算符将变量初始化为空数组。
const fromDb = undefined; const arr = fromDb || []; console.log(arr); // 👉️ [] arr.forEach(element => { console.log(element); });
如果左边的值是假的(例如 ),逻辑 OR (||) 运算符返回右边的值undefined
。
您还可以在调用该方法之前提供空数组的回退
forEach()
。
const arr = undefined; (arr || []).forEach(element => { console.log(element); });
如果arr
变量存储的是假值(例如undefined
),则表达式将调用forEach()
空数组上的方法。
使用if
语句解决错误
解决该错误的一种简单方法是使用语句if
。
const arr = undefined; if (arr) { arr.forEach(element => { console.log(element); }); }
该if
语句检查arr
变量是否存储真值。
您还可以显式检查变量是否存储数组。
const arr = undefined; if (Array.isArray(arr)) { arr.forEach(element => { console.log(element); }); }
如果提供的变量存储数组,则该Array.isArray()
方法返回,否则返回。true
false
使用可选的链接 (?.) 运算符
如果变量存储值,您还可以使用可选的链接 (?.) 运算符进行短路undefined
。
const arr = undefined; arr?.forEach(element => { console.log(element); });
如果左侧的值为空值(或),则可选链接(?.)运算符短路并返回。undefined
null
undefined
出现错误的其他原因
该forEach()
方法由多个对象实现:
如果将方法与数组一起使用,请使用可选的链接 (?.) 运算符或方法Array.isArray
以仅forEach()
在有效数组上调用方法。
if
带有真实性检查的语句,因为所有数组、Map 和 Set 对象都是真实值。解决使用数组时的错误
当尝试访问不存在的数组索引时,通常会发生错误。
const arr = []; // ⛔️ Cannot read properties of undefined (reading 'forEach') arr[0].forEach(element => { console.log(element); });
我们在 index 处访问了一个空数组0
,它返回undefined
,并对值调用了该forEach
方法undefined
。
如果不确定
索引是否存在于数组中,请使用可选的链接运算符。
const arr = []; arr[0]?.forEach(element => { console.log(element); });
可选的链接 (?.) 运算符不会调用该forEach
方法,因为在索引处访问数组0
会返回一个undefined
值。
追踪变量赋值的undefined
位置
如果错误仍然存在,您必须追踪变量在何处被赋值
undefined
。
undefined
是将不返回任何内容的函数的输出分配给变量。许多在适当位置改变对象的内置方法返回undefined
。
所有不返回值的 JavaScript 函数都返回undefined
。