node.js - 理解 nodejs 中的解构
问题描述
下面是简单的代码来说明在 nodejs 中使用 let 和解构
function main(){
let options = {};
let [r, s, e] = [1, 2, 3];
if(true){
options = {a: 12}
[r, s, e] = [3, 4, 5];
console.log(options, r, s, e);
}
}
main();
输出 - [ 3, 4, 5 ] 1 2 3
输出很奇怪。它应该是 {a: 12} 3 4 5
当我将分号放在第 5 行的末尾时
options = {a: 12};
我得到正确的输出 - {a: 12} 3 4 5
我根本无法证明分号有什么不同?
解决方案
Javascript 在您的语法实际中断的情况下处理自动分号插入。检查以下条件
当遇到语法不正确的行终止符或“}”时,将插入分号。因此,如果在前一行代码之后立即解析新的代码行仍然导致有效的 JavaScript,则不会触发 ASI。
如果程序到达输入的末尾并且没有错误,但它不是一个完整的程序,则会在末尾添加一个分号。这基本上意味着如果缺少分号,将在文件末尾添加分号。
在语法中的某些地方,如果出现换行符,它会无条件地终止语句并添加分号。一个例子是返回语句。
更多详细信息请参考这篇文章:分号 - 使用或不使用
在您的情况下,它违反了第一条规则,因为
if(true){
options = {a: 12}
[r, s, e] = [3, 4, 5];
console.log(options, r, s, e);
}
将被视为
if(true){
options = {a: 12}[r, s, e] = [3, 4, 5];
console.log(options, r, s, e);
}
这基本上相当于动态对象值引用和赋值
options = {a: 12}[3, 4, 5] = [3, 4, 5];
并且{a: 12}[3, 4, 5] = [3, 4, 5];
实际上会将对象值设置为{a: 12, 3: [3, 4, 5]}
但是此时选项也分配给[3,4,5]
推荐阅读
- java - 如何在 Spring reactive 的 ServerHttpResponse 中设置非标准的 HttpStatus?
- ios - SwiftUI - 导航链接。如何根据后端响应进行路由?
- java - 如何将数据库中的元素检索到 JDBC 程序中
- ios - 无效证书 (CSR)
- excel - 计数和过滤最大数量和对应字符串
- python - 从字符串列表中获取最长持续时间
- powershell - 当导入的文件来自 Import-csv 时,Powershell ExportCSV 导出一个空文件
- f# - 这个对象会在 F# 的垃圾收集中存活下来吗?
- azure-active-directory - 如何使用 Azure AD 和 WebJobs SDK 连接到存储队列?
- html - 从页面前面获取一个值并在表单中使用它