源自TypeError的标准问题在Google Apps Script 中无法[调用方法/read属性/set属性]为null
对以下问题的建议参考:
- 为什么项目中GS文件的执行顺序会导致
TypeError: Cannot read property "sayName" from undefined.
- 测试触发器会导致
ReferenceError: 'e' is not defined.
或TypeError: Cannot read property *...* from undefined
- TypeError:无法读取属性";0";来自未定义
- 谷歌脚本通过电子邮件发送表单值,错误:无法读取属性"namedValues<OP没有足够的细节,但有三个不同的答案,适用于不同的场景>
- TypeError:无法调用方法";getName"个,共个未定义
- TypeError:无法读取属性';值';(第3行,文件"代码"(。我有一个表单提交的触发器,但它仍然有一个错误属性名称中缺少字符(OP使用值而不是值(
描述
错误消息表示您正试图访问Object
实例上的属性,但在运行时期间,变量实际持有的值是一种特殊的数据类型undefined
。
请参阅底部的关键术语定义
原因:
-
访问不存在的对象的属性时发生错误。
如果对象中不存在某个属性,则访问该属性会导致未定义,并最终导致类型错误,如果像访问真实对象一样访问未定义。。这可能是由于打字错误或使用不区分大小写的名称来访问属性。此错误的变体(用数值代替属性名称(表明应为
Array
的实例。由于JavaScript中的数组是对象,所以这里提到的关于它们的一切都是正确的。
const obj = {a:1};
const b = obj.b;//undefined because b isn't available on obj. But doesn't throw a error
console.log(b.toString())//Throws type error
访问数组索引大于最后一个元素的索引
Array.prototype.length返回数组的元素数。这个数字总是大于最后一个元素的索引,因为JavaScript使用基于0的索引。访问任何大于或等于数组长度的索引都会导致此类型错误。例如,当访问长度为
3
的数组中的第三个元素时,
const a = [[1],[2],[3]];
const getElement3 = a[3];//undefined,because `3`'s index is ``2`` not `3`;But doesn't throw a error
console.log(getElement3[0])//Throws type error
在没有事件的情况下访问事件对象:
动态构建的对象有一种特殊情况,例如仅在特定上下文中可用的事件对象,如向应用程序发出HTTP请求或通过时间或基于事件的触发器调用函数。
错误是TypeError,因为应为
"object"
,但收到的是"undefined"
如何修复
使用默认值
如果左侧为null
或undefined
,JavaScript中的Nullish合并运算符??
运算符将计算右侧。如果属性至少为undefined
,则像(myVar ?? {}).myProp
(或数组的(myVar ?? [])[index]
(这样的表达式将保证不会引发错误。
也可以提供默认值:(myVar ?? { myProp : 2 })
默认保证访问myProp
返回2
。阵列也是如此:(myVar ?? [1,2,3])
。检查类型
特别是在特殊情况下,typeof
运算符与if
语句和比较运算符相结合,将允许函数在其指定上下文之外运行(即用于调试目的(,或者根据对象是否存在引入分支逻辑。
可以控制检查的严格程度:- lax("未定义"(:
if(typeof myVar !== "undefined") { //do something; }
- 严格("仅适当对象"(:
if(typeof myVar === "object" && myVar) { //do stuff }
- lax("未定义"(:
关键术语
- 对象
- 它是JavaScript数据类型之一
- undefined
- 它是JavaScript基元数据类型之一
要了解JavaScript数据类型和对象的基本知识,请参阅什么是JavaScript数据类型?物体究竟是什么?[JavaScript]。
从此处提取的原始修订版(记入@OlegValter(