ES6 模块 - 为什么命名的 const 导出不是只读的
ES6 Modules - why named const exports are not read only
我一直在 reading about ES modules 进行试验,偶然发现了一个我无法解释的案例:
// settings.js
export const FOO = 42;
export const BAR= 5;
// main1.js
import * as settings from './settings';
settings.FOO = 1;
//main2.js
import {FOO, BAR} from './settings'
FOO = 1;
在 main1.js
中,我可以通过 settings
变量覆盖 const
值,但在 main2.js
中,我不能(如预期的那样)。
(理论)问题是为什么在第一种情况下可以覆盖 const
值?创建 "read only view" 是否只是在常规对象上创建属性并破坏原始结构?
实际问题是从模块中 return 一组常量(或只读属性)的最有效方法是什么?我的想法是:
// settings.js
export default Object.freeze({
FOO: 42,
BAR: 5
});
有什么想法吗?
编辑:我正在使用 Babel。
在此代码中
import * as settings from './settings';
settings.FOO = 1;
在上面的代码中,您没有直接赋值给常量变量,而是在 settings
.
中的克隆副本
import * as settings from './settings';
^^^^^^^^^^^^
settings.FOO = 1;
但在接下来的代码中就不是这样了
import {FOO, BAR} from './settings'
FOO = 1;
这里的FOO
和BAR
是常量,不能赋值给它。
其他答案不正确。
The (theoretical) question is why in the first case it's possible to override the const value?
这实际上完全独立于const
。使用 ES6 模块语法,不允许从模块外部重新分配模块的导出值。 export let FOO;
或 export var FOO;
也是如此。代码 inside 模块是唯一允许更改导出的东西。
技术上settings.FOO = 1
应该抛出异常,但大多数编译器目前不处理这种特殊的边缘情况。
举个例子,你可以这样做
export var FOO;
export function setFoo(value){
FOO = value;
}
鉴于此,this 是 const
变得有用的时候,因为它与任何其他普通 JS 代码相同。 FOO = value
如果声明为 export const FOO
会失败,所以如果你的模块正在导出一堆常量,做 export const FOO = 1, FOO2 = 2;
是导出常量的好方法,只是 Babel 没有实际上使它们不可变。
我一直在 reading about ES modules 进行试验,偶然发现了一个我无法解释的案例:
// settings.js
export const FOO = 42;
export const BAR= 5;
// main1.js
import * as settings from './settings';
settings.FOO = 1;
//main2.js
import {FOO, BAR} from './settings'
FOO = 1;
在 main1.js
中,我可以通过 settings
变量覆盖 const
值,但在 main2.js
中,我不能(如预期的那样)。
(理论)问题是为什么在第一种情况下可以覆盖 const
值?创建 "read only view" 是否只是在常规对象上创建属性并破坏原始结构?
实际问题是从模块中 return 一组常量(或只读属性)的最有效方法是什么?我的想法是:
// settings.js
export default Object.freeze({
FOO: 42,
BAR: 5
});
有什么想法吗?
编辑:我正在使用 Babel。
在此代码中
import * as settings from './settings';
settings.FOO = 1;
在上面的代码中,您没有直接赋值给常量变量,而是在 settings
.
import * as settings from './settings';
^^^^^^^^^^^^
settings.FOO = 1;
但在接下来的代码中就不是这样了
import {FOO, BAR} from './settings'
FOO = 1;
这里的FOO
和BAR
是常量,不能赋值给它。
其他答案不正确。
The (theoretical) question is why in the first case it's possible to override the const value?
这实际上完全独立于const
。使用 ES6 模块语法,不允许从模块外部重新分配模块的导出值。 export let FOO;
或 export var FOO;
也是如此。代码 inside 模块是唯一允许更改导出的东西。
技术上settings.FOO = 1
应该抛出异常,但大多数编译器目前不处理这种特殊的边缘情况。
举个例子,你可以这样做
export var FOO;
export function setFoo(value){
FOO = value;
}
鉴于此,this 是 const
变得有用的时候,因为它与任何其他普通 JS 代码相同。 FOO = value
如果声明为 export const FOO
会失败,所以如果你的模块正在导出一堆常量,做 export const FOO = 1, FOO2 = 2;
是导出常量的好方法,只是 Babel 没有实际上使它们不可变。