不可变的原始值和可变的对象引用

javascript的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值。对数字和布尔值来说显然如此—改变数字的值本身就说不通,而对字符串来说就不那么明显了,因为字符串看起来像由字符组成的数组,我们期望可以通过指定索引来修改字符串中的字符。实际上,javascript是禁止这样做的。字符串中所有的方法看上去返回一个修改后的字符串,实际上返回的是一个新的字符串。

原始值得比较是值得比较:只有在它们的值相等时它们才相等。这对数字、布尔值、null和undefined来说听起来有点难懂,并没有其他方法比较它们。同样,对于字符串来说则并不明显:如果比较两个单独的字符串,当且仅当它们长度相等且每个索引的字符都相等时,javascript才认为他们相等。

对象和原始值不同,首先,他们是可变的—它们的值可修改的。对象的比较并非值得比较:即两个对象包含同样的属性及相同的值,它们也是不想等的。各个索引元素完全相等的两个数组也不想等。

我们通常将对象成为引用类型,以此来和javascript的基本类型区分开来,对象值都是引用,对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。将对象(或数组)赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次。如果想得到一个对象或数组的副本,则必须显式复制对象的每个属性或数组的每个元素。

原文地址:https://www.cnblogs.com/james2015/p/5021796.html