js的值传递和引用(地址)传递面试
首先总述一下:
js的5种基本数据类型 number,string,null,undefined,boolean 在赋值传递时是值传递,
js的引用数据类型(object,array,function)进行引用传递,其实底层都是对象。编辑器
废话很少说,下面直接上代码学习
值传递例子:spa
1 var a = 10; 2 var b = a; 3 b = 5; 4 console.log('a:'+a,'b:'+b) // a:10 b:5
一样的,若是你改变其中a的值,a的值变化,b不会改变。code
基本数据类型的赋值传递,变量直接包含的是一个值,你能够理解这个赋值过程为把你电脑里的一个文件(假设原本在c盘)复制到了D盘,而后你就很清楚知道,它两是彻底不相干的两个文件(复制可是没修改前只是内容同样)了,没有关联性的独立文件,不会相互干扰。(不一样地址路径下相同的值)对象
引用传递例子以下:blog
1 var obj = {a:1,b:2,c:3}; 2 var objed = obj; 3 objed.a = 0; 4 console.log('obj:',obj,'objed:',objed) // obj: {a: 0, b: 2, c: 3} objed: {a: 0, b: 2, c: 3}
obj对象赋值给变量objed,须要理解的是,对象是以地址的形式存放在内存中的。仍是用简单易懂的话说吧,变量obj存放的不是a,b,c这三个值,而是它这个总体对象占用的一个空间(有些人用相似堆和栈的思路来对比理解),你每看到一个对象(非基本数据类型皆是对象),你看到的应该是一个空间,便于理解,能够本身取个名字“#001”(随便叫什么都行)。那么变量obj就是一个叫“#001”的地址空间,这个空间里面有a,b,c三个东西,且有它的值。objed变量被赋“值”是这个空间“#001”。因此obj和objed实质上都是叫“#001”的空间,不论你是修改obj里内容仍是objed里的内容,实质上都是“#001”空间里的那个它。因此修改变量obj的内容和objed的内容都是同一个东西,obj和objed都是同样的内容包含。一样用使用电脑来理解,就是你将你的文件放到编辑器上修改创做,你会发现,你修理和鞭打的是你编辑器里的代码,可是你磁盘里的文件一样在挨打😃。编辑器里的和你磁盘里躺的伤口如出一辙。由于你的代码文件被放到了编辑器的工做空间了。它也是一个空间。实际操做的就是同一个东西。只不过须要保存去实现赋值这一步!内存
好了,言语过于累赘,重要的是本身理解到。下面是看到过的面试题,能够看看你是否真的理解了呢?string
1 function changeAgeAndReference(person) { 2 person.age = 20; 3 person = { 4 name: 'Paul', 5 age: 30 6 }; 7 return person; 8 } 9 var personObj1 = { 10 name: 'changeAlive', 11 age: 25 12 }; 13 var personObj2 = changeAgeAndReference(personObj1); 14 console.log(personObj1); // -> ? 15 console.log(personObj2); // -> ?
以上存粹是我的理解。欢迎讨论,留言,一块儿学习!io