突变是你在JavaScript世界中经常听到的东西,但它们到底是什么,它们是否像人们说的那样邪恶?
在这篇文章中,我们将介绍变量赋值和突变的概念,看看为什么它们会成为开发者的一个真正的麻烦。我们将研究如何管理它们以避免问题,如何尽可能少地使用它们,以及如何保持你的代码可预测性。
如果你想更详细地探讨这个话题,或者想了解现代JavaScript,请查看我的新书 学习用JavaScript编码.
让我们从价值类型的最基本的东西开始......
数据类型
JavaScript中的每一个值都是一个原始值或者一个对象。有七种不同的原始数据类型。
- 数字,如
3,0,-4。0.625 - 字符串,如
'Hello',"World",`Hi`。'' - 布尔运算,
true和false nullundefined- 符号 - 一个独特的标记,保证永远不会与另一个符号相冲突
BigInt- 用于处理大的整数值
任何不是原始值的东西都是一个对象,包括数组、日期、正则表达式,当然还有对象字面。函数是一种特殊类型的对象。它们绝对是对象,因为它们有属性和方法,但它们也能被调用。
变量赋值
变量赋值是你在编码中最先学会的东西之一。例如,这就是我们如何将数字3 赋给变量bears
const bears = 3;
变量的一个常见的比喻是一个带有标签的盒子,里面放有数值。上面的例子将被描绘成一个包含标签 "bears "的盒子,里面的数值是3。

另一种思考方式是将标签bears 映射到3 的值上。

如果我把数字3 赋给另一个变量,它就会引用与bears相同的值。
let musketeers = 3;

变量bears 和musketeers 都引用了同一个原始值 3。我们可以用严格的平等运算符=== 来验证这一点。
bears === musketeers
<< true
如果两个变量引用的是同一个值,平等运算符就会返回true 。
处理对象时的一些问题
前面的例子显示了原始值被分配给变量。赋值对象时也使用了同样的过程。
const ghostbusters = { number: 4 };
这种赋值意味着变量ghostbusters 引用一个对象。

然而,当把对象赋值给变量时,一个很大的区别是,如果你把另一个对象字头赋值给另一个变量,它将引用一个完全不同的对象--即使两个对象字头看起来一模一样例如,下面的赋值看起来像是变量tmnt (忍者神龟)引用了与变量ghostbusters 相同的对象。
let tmnt = { number: 4 };
尽管变量ghostbusters 和tmnt 看起来像是引用了同一个对象,但实际上它们都引用了一个完全不同的对象,如果我们用严格的平等运算符检查,就可以看到。
ghostbusters === tmnt
<< false

继续阅读《JavaScript中的变量赋值和变异指南》,请点击SitePoint。
