为什么 TypeScript 编译器通过两次检查来编译其可选链接和空合并运算符?

2023-12-30

为什么 TypeScript 编译器编译它的可选的链接和空合并 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html运营商,?. and ??, to

// x?.y
x === null || x === void 0 ? void 0 : x.y;

// x ?? y
x !== null && x !== void 0 ? x : y

代替

// x?.y
x == null ? void 0 : x.y

// x ?? y
x != null ? x : y

?

可能性是在幕后== null执行相同的两次检查,但即使出于代码长度的考虑,单次检查似乎会更干净。当使用可选链接字符串时,它也会添加更少的括号。

顺便说一句,我也很惊讶可选链不能编译为

x == null ? x : x.y

保存null vs undefined。此后已得到答复:为什么 JavaScript 的可选链使用 undefined 而不是保留 null? https://stackoverflow.com/q/69856082/3120446


您可以在以下位置找到权威答案微软/TypeScript#16 https://github.com/microsoft/TypeScript/issues/16(哇,好旧的);具体解释在这条评论 https://github.com/microsoft/TypeScript/issues/16#issuecomment-515694505:

那是因为document.all[...],这是一种为了向后兼容而在语言中得到特殊对待的怪癖。

document.all == null // true
document.all === null || document.all === undefined // false

在可选链提案中

document.all?.foo === document.all.foo

but document.all == null ? void 0 : document.all.foo会错误地返回void 0.

所以有一个特别的 https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot特殊的、不赞成的、过时的、古怪的遗产伪财产 https://stackoverflow.com/questions/33075262/what-is-an-internal-slot-of-an-object-in-javascript类型的边缘情况HTMLAllCollection https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#the-htmlallcollection-interface没有人使用,这大致等于null但并不严格等于其中任何一个undefined or null。惊人的!

似乎没有人认真考虑过breaking东西为document.all。并且自从xxx === null || xxx === undefined版本适用于所有情况,这可能是发出向后兼容的 JS 代码的最简洁的方式,该代码的行为符合规范。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 TypeScript 编译器通过两次检查来编译其可选链接和空合并运算符? 的相关文章

随机推荐

  • Flutter Dart HTTP POST 请求正文在服务器端为空

    我正在开发 Flutter 平板电脑应用程序 一旦输入一个输入字段 我就会尝试向服务器发送一个发布请求 以下是我为此调用的方法 Future lt http Response gt postRequest async print globa
  • 在环境变量中设置额外的主机

    我正在使用 docker compose 来运行我的应用程序 为此 我需要在容器内设置主机 这取决于我正在运行的环境 我的方法是 创建环境文件并设置变量 application env SERVER IP 10 10 9 134 我的 do
  • 发出拉取请求后,Jenkins 将禁用分支上的项目构建

    注意 我只在我的一个分支中设置了 Jenkinsfile 而不是在主分支中设置 我已经设置了 Git webhooks 来监视推送到我的 Github 存储库的事件 但是 我注意到我的 Jenkins 构建作为分支工作正常 拾取推送事件 触
  • 从 SQL 表中选择行的百分比?

    我有一个带有 PHP 脚本的网站 该脚本内部有一个 SQL 查询 返回由 JavaScript 文件访问的数据 该数据是一个巨大的航班数据列表 我需要能够随机选择 比方说 任何指定日期的总航班数的 40 为了论证起见 让我们这样说 quer
  • 指针可以指向它自己吗?

    我的问题是 如果指针变量的地址与其值相同 那么它真的指向自身吗 例如 在下面的代码中 是a指向自身的指针 include
  • 熊猫的分层抽样

    我看过Sklearn 分层抽样文档 http scikit learn org stable modules generated sklearn model selection train test split html以及熊猫文档 htt
  • 对象方法的匿名函数[重复]

    这个问题在这里已经有答案了 可能的重复 直接调用分配给对象属性的闭包 https stackoverflow com questions 4535330 calling closure assigned to object property
  • 基于 C# 套接字的 HTTP

    我正在尝试通过 C 套接字发送 HTTP 请求并从服务器接收响应 而且我是这种语言的新手 我写了以下代码 IP解析正确 IPEndPoint RHost new IPEndPoint IP Port Socket socket new So
  • Windows命令行重定向下的c ++换行符

    我发现 Windows 命令行重定向会自动将 n 替换为 r n 有什么方法可以避免这种情况吗 因为在 stdout 或 stderr 重定向之后 如果将 r n 写入控制台 您将得到 r r n 而不是 r n 多谢 你可以尝试一个简单的
  • Visual Studio 中使用的 JavaScript 参考语法是什么?

    在 Visual Studio 2012 中 我创建了一个 Web 应用程序 然后在默认值中找到了以下行 references js项目附带的脚本
  • 为什么没有 boost::intrusive::map ?

    升压文档 http www boost org doc libs 1 55 0 doc html intrusive html http www boost org doc libs 1 55 0 doc html intrusive ht
  • OpenCV:加载带有 alpha 通道但 8 位深度的图像

    我对这些标志有点困惑cv imread takes 我的目标是加载具有 alpha 通道的图像 即CV 8UC4 同时我想始终以 8 位深度加载它们 首先我尝试使用以下内容 cv imread path cv IMREAD COLOR 这会
  • 如何设置文本区域滚动条的样式

    我在联系表单中有一个使用 css 样式的文本区域 它看起来很棒 直到我写的内容超出了该区域可以容纳的范围 当我这样做时 会出现一个滚动条 并且这个滚动条在我的深色样式中看起来很糟糕 它是黑底白字 文本 那么我该如何设计这个呢 我用谷歌搜索了
  • 在 Android .aar 库中重新打包 .jar-s

    源代码 Library https bitbucket org victorapoyan renamingpackagedependency 使用库的项目 https bitbucket org victorapoyan renamingp
  • Ember 升级中的 JQueryUI

    按照建议升级并关闭 Bower 后 有没有办法在不使用 Bower 的情况下将 JQueryUI 包含到 Ember 项目中 我的项目很大程度上依赖于 JQueryUI 对话框 ember v ember cli 3 3 0 node 8
  • 如何在 JavaScript 调试终端中运行 VSCode 任务?

    我希望 VSCode 运行此任务 label Start type shell command npm run start dependsOn Set Envs problemMatcher presentation group Main
  • 如何从 golang 中的 http 请求中读取标头?

    如果我收到类型的请求http Request 如何读取特定标头的值 在本例中 我想从请求标头中提取 jwt 令牌的值 您可以使用r Header Get https golang org pkg net http Header Get fu
  • 输入字段中的字符限制为字母和数字

    我希望尝试在我的网站上订阅的人输入昵称 并且该昵称应仅由字母和数字组成 根本没有特殊字符 我想要以下内容 abcdefghijklmnopqrstuvwxyz1234567890 only 我如何检查它是否只有这些 HTML5 解决方案将是
  • deparse(substitute()) 正常返回函数名称,但在 for 循环内调用时返回函数代码

    我对 R 在一个非常具体的情况下的行为感到有点惊讶 假设我定义了一个函数square返回其参数的平方 如下所示 square lt function x return x 2 我想在另一个函数中调用这个函数 并且我还想在这样做时显示它的名称
  • 为什么 TypeScript 编译器通过两次检查来编译其可选链接和空合并运算符?

    为什么 TypeScript 编译器编译它的可选的链接和空合并 https www typescriptlang org docs handbook release notes typescript 3 7 html运营商 and to x