数组赋值和传递(从网上看到的几种情况)

    xiaoxiao2021-03-25  118

    关于数组是引用类型

    情况一:改变原数组,被赋值的数组是否改变

    var a = [1,2,3]; var b = a; a = [4,5,6];//给了a新引用 alert(b); //[1,2,3] //b的引用是最初的a的地址,所以b没有改变 var a = [1,2,3]; var b = a; a.pop();//改变了a的数组地址,所以b引用的是a,则b随之改变 alert(b); //[1,2]

    情况二:传值与传址

    JS中没有指针,只有传值(value)与传址(reference引用)的区别

    var a = [1,2,3,4] //a不仅是数组,还是个对象,实际上a就是对[1,2,3,4]的引用 var b=a  var c=a //以上两条赋值语句建立了b与c 对a即[1,2,3,4]的引用. //无论改变a 还是b抑或c 都是对[1,2,3,4]的操作,这就是传址(堆中操作) // !!!但这里说的对a,b的改变是指对数组本身的改变,即改变b[0],a[0]也会变。 不是指对a,b覆盖新引用的改变,如a=[5,6,7,8]。

    var d=a[1] //则是把a[1]的值"1"传递给d,对d的改变则不会影响a[1],即所谓的传值(栈中操作)

    例子:

    var a=[1,2,3,4]; //例子1 var b=a; alert(a); //1234 alert(b); //1234 //例子2 var c=a; c[3]=5; alert(c); //1235 alert(a); //1235 //例子3 var d=a[1]; d=10; alert(a); //1234 情况三:在函数中对数组用新引用覆盖,对外部不可见,但对数组对象本身修改外部可见

    //传值的传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见 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并没有互换 因为用新引用覆盖在外部不可见 这个很自然 因为函数只是拿到了引用 并没有权力更改引用

    转载请注明原文地址: https://ju.6miu.com/read-9291.html

    最新回复(0)