JS对象传递方式 学习笔记

Js代码  收藏代码
  1. var    obj = { key1: "hello" , key2: "world" };  
  2. function modifyObj(obj){  
  3.     obj = { key3: "world1", key4: "hello1" };  //将不会改变外部的obj  
  4. }  
  5. function changeObj(obj){  
  6.     obj.key3 = "world2";  
  7.     obj.key4 = "hello2";  //将改变外部的obj对象的属性  
  8. }  
  9. obj  //函数调用前obj属性  
  10. Object  
  11. key1: "hello"  
  12. key2: "world"  
  13. __proto__: Object  
  14.   
  15. modifyObj(obj)  
  16. obj  //函数调用后obj属性没有变化  
  17. Object  
  18. key1: "hello"  
  19. key2: "world"  
  20. __proto__: Object  
  21.   
  22. changeObj(obj)  
  23. obj   //函数调用后,属性发生了变化  
  24. Object  
  25. key1: "hello"  
  26. key2: "world"  
  27. key3: "world2"  
  28. key4: "hello2"  
  29. __proto__: Object  
 
原因分析:
Javascript中,对象的传递实际是引用地址的传递,当给函数设置属性时,对象的引用首地址并没有发生改变, 函数内部增加属性时,函数调用结束后,增加的属性继续生效
当在函数内部将传入引用的地址指向一个新的栈地址时,函数调用结束可能会导致引用指向无效的地址,故Javascript规范特别规定了,在函数内修改对象的引用地址时,函数调用结束后引用地址不做改变
posted @ 2017-01-15 21:52  天涯海角路  阅读(219)  评论(0)    收藏  举报