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

 


 

posted @ 2014-04-04 22:36  kpbiao  阅读(194)  评论(0编辑  收藏  举报