基本类型和引用类型调用是的区别(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,沪
 

缘起上面一段代码,结果出来感受疑惑了。spa

缘由是Object.create出来的newPerson实际上是一个空对象,原型是person。指针

newPerson.name赋值或者读值的时候会首先去person中去找,若是有name属性。则返回原型person.namecode

若是没有则从新赋值。对象

按照这个思路解释的时候,看官就感受奇怪了,那newPerson.address.province这个值赋值的的时候也是newPerson的不是person的啊。blog

这个就涉及到基本类型和引用类型的区别了。内存

基本类型(Undefined、null、Boolean、Number、String)在内存中占据固定的内存大小,所以被保存在栈内存中,从一个变量像另外一个变量复制基本类型的的值,会建立这个值的副本。newPerson.name是person.name的个副本。ci

引用类型(Object、Array、Date、RegExp、Function)的值是对象,保存在堆内存中,包含引用类型的值的变量实际上包含的并非对象自己,而是一个指向该对象的指针。原型

一个变量向另外一个变量复制引用类型的值,其实复制的是指针,所以两个变量指向同一个对象。所以在create一个 仍是指向person的对象。it

相关文章
相关标签/搜索