JS 里怎么赋值才不报警告,简直要疯掉了

如题所述

例子:

    var a = [1, 2, 3];  

    var b = [5, 6];  

    var c=100;

    function change(a,b,c) {  

    c=99;

    a[0] = 4;     

    var c = a;  

    a = b;       

    b = c;  

    }  

    change(a,b,c);  

    alert(c);    //"100";

    alert(a);    //"4,2,3"  

    alert(b);     //"5,6"  

    这道题也有些迷惑性。调用了交换函数,但a与b的实际值并不交换。因为函数中只是新创建了一个与a,b栈区所存地址相同的参数。也就是说函数中的a,b,c都不是函数外的a,b,c .不会修改其栈区内容。

    另一个例子:

    var a = [1,2,3];

    var b = a;

    a = [4,5,6];

    alert(b);  //[1,2,3]

     çœ‹äº†å‰é¢çš„内容,此处很容易认为第三步时修改了地址指向的数据,从1,2,3修改为4,5,6, 所以alert(b);  //[4,5,6]

    但要搞清创建对象和其他的区别。第三步意味创建了一个[4,5,6]的对象,并将其地址赋给a. 所以a不再指向[1,2,3].

    同理,若想要b有a的值,但不想联动。可以有以下方法:

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

    [html] view plain copy 

    <script type="text/javascript">  

    var a=[1];  

    var b;  

    b= $.extend(true,{},a)  

    b[0]++;  

    alert(b[0]);   

    </script>  


    方法二:用数组的concat方法

    [html] view plain copy 

    <script type="text/javascript">  

    var a=[1];  

    var b=a.concat();  

    b[0]++;  

    alert(a[0]);   

    </script>  

    方法三:for循环数组,挨个赋值。

    var a=[1,2,3];

    var b=[];

    for(var i=0; i<a.length; i++){

    b[i]=a[i];

    }

    方法四:数组的slice()方法。

    arrayObject.slice(start,end)
    返回一个新数组,包含从start到end(不包含此元素)的arrayObject中元素。该方法不修改原数组,而是返回一个新数组。
    var arr =["a","b","c","d","e"];var arr1=arr.slice(2,4);console.log(arr1);            //"c,d"var arr2=arr.slice(0);console.log(arr2);            //"a,b,c,d,e"arr2[2]="wang"console.log(arr);            //"a,b,c,d,e" 与原数组不联动console.log(arr2);           //"a,b,wang,d,e"

    阿里2014年的笔试题: 

    var a = 1;

    var obj = {

    b: 2

    };

    var fn = function () {};

    fn.c = 3;

    function test(x, y, z) {

    x = 4;

    y.b = 5;

    z.c = 6;

    return z;

    }

    test(a, obj, fn);

    alert(a + obj.b + fn.c);

    答案:12

    首先test传递进去的实参中,a是基本类型(,复制了一份值),obj是object(指向地址,你动我也动),fn也当然不是基本类型啦。在执行test的时候,x被赋值为4(跟a没关系,各玩各的,a仍然为1),y的b被赋值为5,那obj的b也变为5,z的c变为6,那fn的c当然也会是6. 所以alert的结果应该是1+5+6 =12. (其实test不返回z也一样,z仍然改变的)。

温馨提示:答案为网友推荐,仅供参考
相似回答