JavaScript中的不可变原始值和可变对象引用
在JavaScript中,原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)之间存在着根本的区别。原始值是不可变的,意味着它们的值无法改变。这对于数字和布尔值很容易理解:修改它们的值是没有意义的。然而,对于字符串来说,这可能会稍微不太直观。由于字符串类似于字符数组,可能会认为在特定索引处修改字符是可能的。然而,JavaScript不允许这样做。所有看似修改字符串的方法实际上都返回一个新的字符串。例如:
原始值通过其值进行比较,意味着只有当两个值的值相同时,它们才被认为是相等的。这在处理数字、布尔值、null和undefined时可能听起来令人困惑。但实际上很简单:例如,当比较两个不同的字符串时,只有当它们具有相同的长度且在相同索引处的每个字符都相同时,JavaScript才认为它们是相等的。
(程序员的软技能:ke.qq.com/course/6034346)
另一方面,对象是可变的;它们的值可以改变:
对象不是通过值进行比较的;即使两个具有相同属性和值的不同对象,也不被认为是相等的。类似地,具有相同元素且顺序相同的两个不同数组也不相等:
对象有时被称为引用类型,与JavaScript的原始类型相对。根据这种术语,对象值是引用,对象通过引用进行比较。换句话说,只有当两个对象值引用相同的底层对象时,它们才相等。
从上面的代码可以看出,将对象(或数组)赋值给一个变量实际上是赋值引用,而不是对象的新副本。如果要创建对象或数组的新副本,必须显式地复制其属性或元素。下面的示例演示了如何使用for循环来实现这个过程:
如果要比较两个不同的对象或数组,必须比较它们的属性或元素。下面的代码定义了一个函数,用于比较两个数组:
(程序员的软技能:ke.qq.com/course/6034346)