基本类型和引用类型调用是的区别(Object.create)
var person = { name : 'jim', address:{ province:'浙', city:'A' } } var newPerson = Object.create(person);
console.log(newPerson.name)//jim newPerson.name ='jack'; newPerson.address.province = '沪'; console.log(person.name, person.address.province) //jim,沪
缘起上面一段代码,结果出来感觉疑惑了。
原因是Object.create出来的newPerson其实是一个空对象,原型是person。
newPerson.name赋值或者读值的时候会首先去person中去找,如果有name属性。则返回原型person.name
如果没有则重新赋值。
按照这个思路解释的时候,看官就感觉奇怪了,那newPerson.address.province这个值赋值的的时候也是newPerson的不是person的啊。
这个就涉及到基本类型和引用类型的区别了。
基本类型(Undefined、null、Boolean、Number、String)在内存中占据固定的内存大小,因此被保存在栈内存中,从一个变量像另一个变量复制基本类型的的值,会创建这个值的副本。newPerson.name是person.name的个副本。
引用类型(Object、Array、Date、RegExp、Function)的值是对象,保存在堆内存中,包含引用类型的值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。
一个变量向另一个变量复制引用类型的值,其实复制的是指针,因此两个变量指向同一个对象。因此在create一个 还是指向person的对象。