天天看點

js中arr的指派不影響原數組,指派和引用的差別

1、指派

[html]  view plain  copy

  1. var a = 1;  
  2. var b = a;   //賦的是a的複制值  
  3. b ++;  
  4. alert(a);   //"1"   b的修改不影響a  

2、引用

[html]  view plain  copy

  1. var a = [1];  
  2. var b = a;     //賦的是a的引用   
  3. b[0] ++;  
  4. alert(a);  //"2"   b的修改對a也有效    不過當然b = [2];這種修改對a是沒用的。。。。。。  

起到引用作用又不影響原數組的方法

方法一:用jq的$.extend方法

[html]  view plain  copy

  1. <script type="text/javascript">  
  2. var a=[1];  
  3. var b;  
  4. b= $.extend(true,{},a)  
  5. b[0]++;  
  6. alert(b[0]);   
  7.     </script>  

方法二:用數組的concat方法

[html]  view plain  copy

  1. <script type="text/javascript">  
  2. var a=[1];  
  3. var b=a.concat();  
  4. b[0]++;  
  5. alert(a[0]);   
  6.     </script>  

方法三:用函數傳參的方法

[html]  view plain  copy

  1. 傳值的傳遞:傳給函數的是數值的一個複制,函數中對其的修改外部不可見  
  2. var a = 1;  
  3. var b = 2;  
  4. function change(a,b) {  
  5.   var c = a;  
  6.   a = b;      //用新引用覆寫  
  7.   b = c;  
  8.   alert(a);   //"2"           
  9.   alert(b);   //"1"  
  10. }  
  11. change(a,b);  
  12. alert(a);   //"1"           
  13. alert(b);   //"2"  
  14. 傳址的傳遞:傳給函數的是數值的一個引用,函數中對其屬性的修改外部可見,但用新引用覆寫其則在外部不可見,比如  
  15. var a = [1, 2, 3];  
  16. var b = [5, 6];  
  17. function change(a,b) {  
  18.   a[0] = 4;    //對其屬性的修改外部可見    
  19.   var c = a;  
  20.   a = b;      //用新引用覆寫  
  21.   b = c;  
  22.   alert(a);   //"5,6"           
  23.   alert(b);   //"4,2,3"  
  24. }  
  25. change(a,b);  
  26. alert(a);    //"4,2,3"  
  27. alert(b);     //"5,6"  
  28. 從結果可以看出a和b并沒有互換   因為用新引用覆寫在外部不可見 這個很自然 因為函數隻是拿到了引用 并沒有權力更改引用  

繼續閱讀