var a = [1],b=[1]; a==b; //fasle var c = b; c[0]=2; b //[2] c = [3]; b //[2]
解释:b对c说,我赞成你跟我共用一个内存地址,你能够在个人内存地址内,修改局部成员,可是你要连个人家都给挪走,对不起 你本身走。。。微信
ECMAScript 中全部函数的参数都是按值传递的。访问变量有按值和按引用两种方式,而参数只能按值传递。
函数
基本类型参数传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见。spa
var a = 1; var b = 2; function change(a, b) { var c = a; a = b; b = c; console.log(a); //2 console.log(b); //1 } change(a, b); console.log(a); //1 console.log(b); //2
引用类型参数传递:传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见code
var a = [1, 2, 3]; var b = [5, 6]; function change(a,b) { a[0] = 4; //对其属性的修改外部可见 var c = a; a = b; //用新引用覆盖 b = c; console.log(a); //"5,6" console.log(b); //"4,2,3" } change(a,b); console.log(a); //"4,2,3" console.log(b); //"5,6"
a,b是change函数中的变量,在调用函数时传递了a,b的引用赋给了这两个变量,可是并不能改变全局中的a,b。由于用新引用覆盖在外部不可见,由于函数只是拿到了引用 并无权力更改引用。图片
var a = [1, 2, 3]; var b = [5, 6]; function change() { var c = a; a[0] = 4; //对其属性的修改外部可见 a = b; //用新引用覆盖 b = c; } change(a,b); console.log(a); //"5,6" console.log(b); //"4,2,3"
由于js没有块级做用域,因此它在change里找不到变量a,b就会自觉的到上层去找,因此这里的a,b是全局变量的引用。
欢迎搜索微信公众号:一线码农
或扫码关注:ip