知识卡片
原始值不可变与对象引用可变
内容
原始值(数字、字符串、布尔、null、undefined)一旦创建就无法被修改,任何看似”修改”字符串的方法(如toUpperCase())实际上都是返回一个全新的值,原字符串本身不变;它们的比较也是值比较,内容相等即相等。对象和数组则相反,是可变的引用类型:把对象赋值给变量只是复制了一个指向同一块内存的引用,并没有复制对象本身,所以两个变量修改的是同一份数据;对象的比较也是引用比较,即使两个对象属性完全相同,只要不是同一个引用就不相等。这个区别解释了为什么”深拷贝”在原始值上是无意义的伪需求,而对对象/数组做值传递语义时必须显式遍历复制每个属性或元素,否则就是共享同一份数据的陷阱。
参考来源
《JavaScript权威指南(原书第6版)》第3章《类型、值和变量》