let a =1
let b=a
a=3
console.log(b)//1
如图所示:简单的值类型,在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上。
此时,a中保存的值为 1 ,当使用 a 来初始化 b 时,b 中保存的值也为11,但b中的1与a中的是完全独立的,该值只是a中的值的一个副本,此后,这两个变量可以参加任何操作而相互不受影响。也就是说基本类型在赋值操作后,两个变量是相互不受影响的。
var obj = {
name:'姓名,
age:'18岁'
}
var objCopy=obj
objCopy.name='张三'
console.log(obj.name)//张三
如图所示:引用类型,当从obj向objcopy赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。 这时保存在变量中的是对象在堆内存中的地址,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响。(简单来说就是赋值前后的两个对象指向的指针是同一个对象,对象内的变量名称相同就会影响到同样名称的变量)