为什么 ECMAScript ES 模块导入不遵循解构标准?
Why ECMAScript ES module import do not follow destructuring standard?
在JavaScript中我可以这样重命名和导入模块
import { original_name as alias_name } from 'my_module'
是否需要as关键字和nod遵循优秀的解构标准有很好的解释吗?
为什么不是这样的:
import { original_name: alias_name } from 'my_module'
我的脑子里总是充满好奇
他们做不同的事情:
- 解构是 属性 访问的一种形式,通常与
const
之类的变量声明相结合,甚至可能与默认初始化程序
- 导入变量会在模块范围内声明绑定的别名
重要的区别在于,解构执行 运行 代码(测试对象可强制性,执行 getter),而导入声明是完全声明的(设置模块之间的依赖关系,甚至在变量之前启用 cross-module 提升被初始化)。这使得后者可以静态分析。导入别名也没有嵌套对象的概念。
两者都允许“重命名”,但它们对不同的事物使用不同的语法 - 否则会造成混淆。他们的 shorthand 形式彼此相似主要是巧合,因为两者都使用大括号。
答案当然是,它们的不同是因为它们做的事情不同,只是语法上有相似之处而已。
但也许有更好的理由来设计它们?我通过以下方式试验了 Node.JS 个模块:
// origin.js
export let specialNumber = 2;
setInterval(() => {
specialNumber = Math.random();
}, 400)
// importer.js
import { specialNumber as aliasAttempt } from './origin.js'
import * as StarImport from './origin.js'
let { specialNumber: destructuringAttempt } = StarImport;
setInterval(() => {
console.log(aliasAttempt, destructuringAttempt);
}, 400)
在这里,destructuringAttempt
将始终给出“2”(解构时得到的值),而 aliasAttempt
将不断变化。例如:
0.3600619094195876 2
0.33268826082163194 2
0.20684912705131553 2
0.8665522020482055 2
0.9349778920742413 2
看起来 destructuringAttempt
在解构期间按值复制,而 aliasAttempt
保留对 let specialNumber
变量的引用。
(destructuringAttempt
的这种行为是预期的,因为 let { specialNumber: destructuringAttempt } = StarImport;
与 let destructuringAttempt = StarImport.specialNumber;
相同,即只是复制了数字)
所以,也许原因是,如果导出是一个 non-const 值,'aliasing' 会给出与典型解构行为(“ copy once"),所以最好区分语法。
在JavaScript中我可以这样重命名和导入模块
import { original_name as alias_name } from 'my_module'
是否需要as关键字和nod遵循优秀的解构标准有很好的解释吗?
为什么不是这样的:
import { original_name: alias_name } from 'my_module'
我的脑子里总是充满好奇
他们做不同的事情:
- 解构是 属性 访问的一种形式,通常与
const
之类的变量声明相结合,甚至可能与默认初始化程序 - 导入变量会在模块范围内声明绑定的别名
重要的区别在于,解构执行 运行 代码(测试对象可强制性,执行 getter),而导入声明是完全声明的(设置模块之间的依赖关系,甚至在变量之前启用 cross-module 提升被初始化)。这使得后者可以静态分析。导入别名也没有嵌套对象的概念。
两者都允许“重命名”,但它们对不同的事物使用不同的语法 - 否则会造成混淆。他们的 shorthand 形式彼此相似主要是巧合,因为两者都使用大括号。
答案当然是,它们的不同是因为它们做的事情不同,只是语法上有相似之处而已。
但也许有更好的理由来设计它们?我通过以下方式试验了 Node.JS 个模块:
// origin.js
export let specialNumber = 2;
setInterval(() => {
specialNumber = Math.random();
}, 400)
// importer.js
import { specialNumber as aliasAttempt } from './origin.js'
import * as StarImport from './origin.js'
let { specialNumber: destructuringAttempt } = StarImport;
setInterval(() => {
console.log(aliasAttempt, destructuringAttempt);
}, 400)
在这里,destructuringAttempt
将始终给出“2”(解构时得到的值),而 aliasAttempt
将不断变化。例如:
0.3600619094195876 2
0.33268826082163194 2
0.20684912705131553 2
0.8665522020482055 2
0.9349778920742413 2
看起来 destructuringAttempt
在解构期间按值复制,而 aliasAttempt
保留对 let specialNumber
变量的引用。
(destructuringAttempt
的这种行为是预期的,因为 let { specialNumber: destructuringAttempt } = StarImport;
与 let destructuringAttempt = StarImport.specialNumber;
相同,即只是复制了数字)
所以,也许原因是,如果导出是一个 non-const 值,'aliasing' 会给出与典型解构行为(“ copy once"),所以最好区分语法。