该该文传授了 JavaScript 中 const URL的用语和它的许多优点。该URL用作建立自表达式,即除非表达式后就无法再修正。但,采用 const 建立的第一类和字符串却能被修正。责任编辑透过传授“表达式”和“突变”间的关键差别,详尽说明了这一现像。
该文具体来说如是说了表达式的四种新闻稿形式:var、let 和 const。它说明了这四种形式的差别,和为何采用 const新闻稿自表达式。接着,该文研讨了“表达式”和“突变”的差别,这是认知 const 的关键性。尽管const 建立的第一类和字符串。
节录已经开始
JavaScript 中的 const URL用作新闻稿自表达式。自表达式一般来说被指出是“无法更动的表达式”:
consthi =5; hi = 10; // Uncaught TypeError: Assignment to constant variable. console.log(hi); // -> 5有意思的是,当我使用const建立两个第一类时,我能民主自由地更动它:
const person = { name: Hassan, }; person.name = Sujata; // Seems to work?? console.log(person); // -> { name: Sujata }我是不是能发生改变 person 表达式?我采用了 const !
为的是认知那个表层上的对立,他们须要介绍表达式和突变间的差别。这是 JavaScript 中的核心概念,当您清楚地认知那个差别时,许多事情就会变得更加清晰。
表达式名作为标签
下面是完全有效的JavaScript程序:
5;这是另两个:
[apple, banana, cherry];在这两个例子中,我正在建立许多东西。两个数字和两个字符串。当代码运行时,这些数据将被建立并存储在计算机的内存中。
这些程序并不是非常有用。我正在建立许多数据,但我没有访问它的形式!
表达式允许他们在他们建立的东西上贴上标签,以便以后能引用它。
// Create it now… const fruits = [apple, banana, cherry]; // …and access it later: console.log(fruits); // -> [apple, banana, cherry]当我刚已经开始学习编程时,我指出代码是从左到右执行的:具体来说他们建立两个 fruits 表达式,就像两个空盒子,接着他们在那个盒子里组装他们的字符串。
原来这并不是正确的心理模型。更准确的说法是,字符串具体来说被建立,接着他们将他们的 fruits 标签指向它。
重新分配他们的标签
当他们采用 letURL建立两个表达式时,他们能更动该标签所引用的“事物”。
例如,他们能将他们的 fruits 标签指向两个新值:
这被称为重新分配。实际上, fruits 标签应该指向两个完全不同的值:
// We start with a labeled array: let fruits = [apple, banana, cherry]; // ⚠️⚠️⚠️⚠️ // 从上面的列表中选择其他选项 //查看它如何在代码中翻译!他们没有修正数据,他们修改的是标签。他们将其从原始字符串中分离出来,连接到两个新字符串中。
相比之下,采用 const 建立的表达式无法重新表达式:
这是 let 和 const 间的根本差别。当他们采用 const时,他们建立了两个不可摧毁的链接,将表达式名和一段数据联系在一起。
然而,问题在于:他们仍然能修正数据本身!只要标签保持完好无损。
例如,采用字符串,他们能轻松地添加/删除其中的项目。fruits 表达式仍然连接到同两个字符串:
这被称为**变异(mutation)**。他们透过添加/删除项目来编辑字符串的值。
这是另两个例子,采用第一类而不是字符串。只要标签继续指向相同的第一类,他们就能编辑第一类中的键/值。
重新分配(将表达式名称指向新事物)和突mutation (编辑事物内的数据)间存在根本差别。
当他们采用 const 建立两个自表达式时,他们能百分之百地确定该表达式永远不会被重新分配,但在突变方面没有任何承诺。const 并不完全阻止突变。
这里还有两个问题:像字符串和数字这样的“原始”数据类型是不可变的。这使得事情变得更加混乱。他们将在下一节中讨论。
如果你正在寻找一种方法来确保你的数据不会被修正,那么有两个方法叫做Object.freeze(),它能派上用场。采用该方法能将第一类和字符串冻结,使它们变成只读的,这样就能保护它们免受修正。这是一种非常有用的方法,特别是在须要确保数据的不可变性时。采用这种方法,即使采用constURL也能确保你的数据不会被修正
// With arrays: const arr = Object.freeze([1, 2, 3]); arr.push(4); console.log(arr); // -> [1, 2, 3] // With objects: const person = Object.freeze({ name: Hassan }); person.name = Sujata; console.log(person);// -> { name: Hassan }据我所知,Object.freeze()是防弹的。无法修正采用此方法冻结的第一类/字符串。
同样,如果你采用TypeScript,你也能采用as const断言来实现类似的结果
const arr = [1, 2, 3] as const; arr.push(4); // Error: Property push does not exist // on type readonly [1, 2, 3].与所有静态类型一样,当代码被编译为JavaScript时,这些保护就会消失,因此这并无法提供与Object.freeze()相同数量的保护。
原始数据类型
到目前为止,他们看到的所有示例都涉及第一类和字符串。但如果他们有两个“原始”数据类型,例如字符串、数字或布尔值,该是不是办呢?
以两个数字为例:
let age = 36; age = 37;他们应该如何说明那个?他们是将age 标签重新分配给两个新值,还是突变那个数字,将 36 编辑为 37 ?
这就是问题所在:JavaScript 中的所有原始数据类型都是不可变的。无法“编辑”数字的值。他们只能将表达式重新分配给不同的值。
假装有两个包含所有可能数字的大列表。他们已经将 age 表达式分配给数字36,但他们能将它指向列表中的任何其他数字:
要明确的是,浏览器并没有所有可能数字的大索引。我希望在这里阐述的重点是数字本身无法更动。他们只能更动标签指向的数字。
这适用作所有原始值类型,包括字符串、布尔值、null等。
如上所述,在JavaScript中,原始值是不可变的;它们无法被编辑。但如果他们能做到呢?如果数字本身可以发生改变,那么语法会是什么样子呢?它看起来是这样的:
// 编辑数字36的值 36 = 37; // 36那个数字不再存在了 console.log(36); // 37所以,如果他们能在JavaScript中发生改变原始值,那就意味着基本上覆盖某些数字,这样它们就永远不会再被引用了!这显然会让人感到困惑和无助,这就是为何在JavaScript中基本类是不可变的。