Javascript 如何将JS const变量编译成浏览器友好的代码,使其成为只读的?

Javascript 如何将JS const变量编译成浏览器友好的代码,使其成为只读的?,javascript,ecmascript-6,constants,babeljs,Javascript,Ecmascript 6,Constants,Babeljs,我有以下变量: const x = ['item'] 然后我尝试使用Babel的实时编译器,它给了我以下编译代码: "use strict"; var x = ["item"]; 现在,当我尝试将其他内容(x={})分配给变量x,它会抛出错误。在编译的代码中,我看不到任何地方像我如何不能更改x!通常,var是可编辑的,对吗 有人能帮我理解吗?你说得对。var通常是可编辑的。我相信您在编写过程中会遇到这个问题。在babel编译期间,它正在对常量变量进行安全检查。同样的事情也发生在typescr

我有以下变量:

const x = ['item']
然后我尝试使用Babel的实时编译器,它给了我以下编译代码:

"use strict";
var x = ["item"];
现在,当我尝试将其他内容(
x={}
)分配给变量
x
,它会抛出错误。在编译的代码中,我看不到任何地方像我如何不能更改
x
!通常,
var
是可编辑的,对吗


有人能帮我理解吗?

你说得对。var通常是可编辑的。我相信您在编写过程中会遇到这个问题。在babel编译期间,它正在对常量变量进行安全检查。同样的事情也发生在typescript中。

你是对的。var通常是可编辑的。我相信您在编写过程中会遇到这个问题。在babel编译期间,它正在对常量变量进行安全检查。同样的事情也发生在typescript中。

如果我尝试babel输出,我可以给x分配一个新值,它就可以正常工作了。原因是输出的代码是ECMAScript 5,并且没有常量的概念。您可以通过在中将const更改为var来尝试

因此,巴贝尔将把它编译(或“transbile”)为可赋值变量,因为没有其他方法。但在执行该操作的过程中,它会验证您的原始代码,以查看您是否没有对x进行赋值,如果您这样做,则会抛出一个错误

Babel检查您是否在编译过程中将其作为常量使用,但在最后的代码中,不再强制执行x为常量,因此您可以通过修改输出的代码轻松地打破这一点


作为比较,任何编译器都是如此。如果使用十六进制编辑器修改可执行文件,还可以破坏编译器在生成可执行文件时所做的任何操作。事实上,对于每个程序的输出来说都是如此,如果你在程序完成后修改它(想想图像、文档等等)

如果我尝试babel输出,我可以给x分配一个新值,它就可以正常工作了。原因是输出的代码是ECMAScript 5,并且没有常量的概念。您可以通过在中将const更改为var来尝试

因此,巴贝尔将把它编译(或“transbile”)为可赋值变量,因为没有其他方法。但在执行该操作的过程中,它会验证您的原始代码,以查看您是否没有对x进行赋值,如果您这样做,则会抛出一个错误

Babel检查您是否在编译过程中将其作为常量使用,但在最后的代码中,不再强制执行x为常量,因此您可以通过修改输出的代码轻松地打破这一点


作为比较,任何编译器都是如此。如果使用十六进制编辑器修改可执行文件,还可以破坏编译器在生成可执行文件时所做的任何操作。事实上,如果您在程序完成后(想想图像、文档等)对其进行修改,则每个程序的输出都是如此。

“现在,当我尝试为变量x赋值时”您在编译器中的何处执行此赋值操作?左手边?像这样
x={}
抛出错误的不是传输代码,而是带有
const
本身的ES6+代码。将代码复制到IDE或浏览器的控制台并重新分配。它应该在不抛出错误的情况下工作error@adiga:巴贝尔抛出一个错误:@FelixKling Yes。这就是我的意思,“现在当我试图给变量x赋值时”你在编译器中的什么地方赋值?左手边?像这样
x={}
抛出错误的不是传输代码,而是带有
const
本身的ES6+代码。将代码复制到IDE或浏览器的控制台并重新分配。它应该在不抛出错误的情况下工作error@adiga:巴贝尔抛出一个错误:@FelixKling Yes。这就是我的意思。