export default <name> 和 export { <name> as default } 的区别
预计 5 分钟
昨天组里面讨论了一些 JS 模块相关的问题。其中说到了 ES Module 导出的是对应变量的「引用」,或者说是对应变量的一个绑定。然后被问到:export default
也是这样吗?
我以为 export default name
和 export { name }
的行为是一样的,在 import
一个模块中的变量实际上是这些变量的一个绑定,在访问变量时取到的就是当时模块中变量对应的值。
如下 export { name }
的形式,在 index.js
中,在调用了 changeName
之后,index.js
中的 name
就从 "John"
变成 "Arya"
了,这没有什么疑问。
但是下面的代码就跟我原来以为的不一样了,看起来,export default name
导出的是值的一个浅拷贝,index.js
中的 name
值不会变。
不过,导出默认值还有另一个写法,也就是:
如果这样一来,那么在 index.js
中,name
的值又会变了。
总结一下,如果是 export default <name>
的话,导出的就是对应值的一个浅拷贝了,而 export { <name> as default }
就还是对变量的一个绑定。以上行为是在 Chrome 中使用原生 ES Module 进行测试的。不过,这个区别在实际开发中倒是没什么用,在平时编写模块的时候,应该避免使用这种行为。另外,有兴趣的话也可以看看 Babel 是如何转码 ES Module 的。
#JavaScript