首页 > 语言 > JavaScript > 正文

浅谈js中的引用和复制(传值和传址)

2024-05-06 14:51:34
字体:
来源:转载
供稿:网友

好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西

先讲一下很基础的东西,看看js中几种数据类型分别传的什么

引用:对象、数组、函数

复制:数字、布尔

字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)但是用于比较的时候显然是属于传值比较(稍后具体说比较的事)

下面讲一下在使用中的具体体现

最普通的使用就是赋值了

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

函数的参数

传值的传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见

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并没有互换   因为用新引用覆盖在外部不可见 这个很自然 因为函数只是拿到了引用 并没有权力更改引用

下面这个就不同了

var a = [1, 2, 3];var b = [5, 6];function change() { var c = a; a[0] = 4; a = b; b = c;};change();alert(a);  //"5,6"alert(b);  //"4,2,3"

这里成功实现互换 

又得提到js的块级作用域了,这个放某些语言里定然是要报未定义错误的,因为js没有块级作用域,所以它在change里找不到变量a,b就会自觉的到上层去找,所以这里的a,b是全局变量的引用

而上面的那个a,b则是change函数中的变量,在调用函数时传递了a,b的引用赋给了这两个变量,但是并不能改变全局中的a,b,这里换个名字大概就好理解多了

这个稍微提下    有些走题了。。。。

回到引用和复制 在比较运算中的注意事项

传值的比较比较的是数值 而传址的比较比较的是引用,引用不同即使数值相同也不等

1 == 1;  //true1 === 1;  //true[0] == [0]; //false[0][0] == [0][0];  //true[0][0] === [0][0];  //true[0].toString() == [0].toString();  //true             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选