为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)

Posted

技术标签:

【中文标题】为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)【英文标题】:why " ".abcd is returning undefined value instead of throwing undefined error in Javascript (But Typescript throwing a warning)为什么“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告) 【发布时间】:2018-10-04 14:10:20 【问题描述】:

请检查以下 3 个 sn-ps 并告诉我它是如何工作的

片段 1

我可以在运行下面的 sn-p 时看到这个错误Uncaught ReferenceError: aaa is not defined",。我知道是因为我们没有定义 aaa 变量。

var a=aaa;

片段 2

而且我在 sn-p 下方收到\"string\".abcd is not a function" 错误。

var a="string".abcd();

片段 3

但是为什么下面的 sn-p 不会抛出像 Uncaught ReferenceError: abcd is not defined", 这样的错误?为什么"string".abcd 返回未定义?

var a=" ".abcd;
console.log(a)

【问题讨论】:

因为这正是该语言的设计方式。 访问未定义的属性返回undefined 期待强制:***.com/questions/7675127/… 我怀疑这收到了反对票,因为您应该使用 RTFM。 意思是“阅读友好手册” 【参考方案1】:

athing.something 表示“从athing 获取名为something 的属性”。

如果属性不存在,则其值为undefined

您新创建的字符串没有abdc 属性。


您无法将其与 Snippet 1 进行比较,因为您处理的是属性,而不是变量。

您可以将其与 Snippet 2 进行比较,后者抱怨它不是函数 - undefined 确实不是函数。

【讨论】:

【参考方案2】:

因为" " 是一个字符串,而javascript 提供了一些默认属性,例如" ".length。因为没有默认的.abcd 它只是说它是未定义的

【讨论】:

【参考方案3】:

其实相当于:

var a = " ";
a.abcd;

它基本上检查 String 构造函数原型中的 abcd 属性。 Snippet 给出错误,因为您正在调用:

undefined()

【讨论】:

以上是关于为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)的主要内容,如果未能解决你的问题,请参考以下文章

当我递归调用它时,为啥我的函数返回以前的值而不是新的值?

从“默认字典”更新值而不删除其键[重复]

如何在循环中更新 html 标记的值而不覆盖前几轮

C语言函数定义时既有返回值也有输出(ptintf),可以调用时只用返回值而不

在 SwiftUI 中捕获文本字段值而不按返回键 [重复]

提交文本框的值而不重新加载页面