入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

js中arr的赋值不影响原数组,赋值和引用的区别

创建时间:2014-04-10 投稿人: 浏览次数:14483

1、赋值

var a = 1;
var b = a;   //赋的是a的复制值
b ++;
alert(a);   //"1"   b的修改不影响a

2、引用

var a = [1];
var b = a;     //赋的是a的引用 
b[0] ++;
alert(a);  //"2"   b的修改对a也有效    不过当然b = [2];这种修改对a是没用的。。。。。。

起到引用作用又不影响原数组的方法

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

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

方法二:用数组的concat方法

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

方法三:用函数传参的方法

传值的传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见
var a = 1;
var b = 2;
function change(a,b) {
  var c = a;
  a = b;      //用新引用覆盖
  b = c;
  alert(a);   //"2"         
  alert(b);   //"1"
}
change(a,b);
alert(a);   //"1"         
alert(b);   //"2"
传址的传递:传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见,比如
var a = [1, 2, 3];
var b = [5, 6];
function change(a,b) {
  a[0] = 4;    //对其属性的修改外部可见  
  var c = a;
  a = b;      //用新引用覆盖
  b = c;
  alert(a);   //"5,6"         
  alert(b);   //"4,2,3"
}
change(a,b);
alert(a);    //"4,2,3"
alert(b);     //"5,6"
从结果可以看出a和b并没有互换   因为用新引用覆盖在外部不可见 这个很自然 因为函数只是拿到了引用 并没有权力更改引用


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。