var a=[1,2,3]
var b=a
b=100
alert(a)谁能帮忙逐行解析一下这段代码?最好涉及一下内存、堆栈、变量怎么赋值的基本概念?比如怎么理解这个[1,2,3]数组,它在内存中如何存储的?

解决方案 »

  1.   

    以下说明仅就javascript而言://给变量a赋值, 内容存在堆空间中,栈空间里保存一个该堆空间的地址
    var a = [1 , 2 , 3];//给变量b赋值,仍是一个引用 , 内容为变量a所指向的内容
    var b=a//给变量b赋值,直接将内容写入栈中。但对于a的内容则无影响
    b=100
    //显示变量a内容,a仍未其引用值,数组[1 , 2 , 3]
    alert(a)
    栈(stack)中存储简单数据段,也就是说,它们的值直接存储在变量访问的位置。而这个变量存储的位置由系统自动分配,大小固定,所以访问速度快。
    堆(heap)中存储复杂的数据对象的引用,也就是说,存储在变量访问位置的是一个指针,它指向了真正存储内容的内存的地址。因堆是有程序控制创建的,所以大小不固定,访问速度慢。不知道是否说的清楚,如果有误,还请各位不吝赐教!
      

  2.   

    不太明白指针式什么
    比如var a=3; 是不是a在栈中有个地址,3也有个地址,然后将a指向3的地址,3的地址就是指针吗?还是那个指向是指针啊?
      

  3.   


    <script>
    var a = [1,2,3];
    var b = a;
    b = 100;  // 重新给b赋值 并不会影响a
    alert(a)  
    </script>
    <script>
    var a = [1,2,3];
    var b = a;
    b.push(4);  // 这样 a b是指向一个内存空间,b push 之后 会 影响a
    alert(a)  
    </script>
      

  4.   

    这样解释,看看是不是容易理解一些。
    栈 , 存放的是简单数据和复杂数据的存放地址。
    也就是说,如果存储的是个简单数据如数字 “3” , 那么就会直接将这个3存放在栈中。
    而如果存储的是个复杂数据对象如:“{id : 123 , name : 'zhangsan' , sex : 'male'}” , 那么该对象其实是存储在堆中的,栈中只是保存了一个该对象在堆中存放的位置。因为程序运行是先去栈中查找值的,所以一旦在栈中发现保存的是个地址,那么就会进一步再去堆中,按照该地址取出存放在堆中的数值。
    堆,存放的是复杂的数据对象,并在栈中保留一个堆中的地址信息,以便程序运行时在栈中找到此对象的引用地址,并获取正确的值。
      

  5.   

    var a=[1,2,3];
    var b=a;
    b=100;
    alert(a);理解为:
    变量是路标,内存是位置,变量赋值后指向内存的某个位置。
    你给b变量赋值为a路标,就是说a、b路标都指向同一个位置。
    然后b=100;相当于改变了b路标指向的位置,但a路标的位置会改变么?当然不会,原位置的内容会受影响么?当然也是不会的。
      

  6.   

            <script>
                var a = [1,2,3];
                var b = a;
                b.push(4);  // 这样 a b是指向一个内存空间,b push 之后 会 影响a
                alert(a)  
            </script>
    这段,理解为:
    给b赋值为a,所以a、b路标指向同一个位置。
    b.push(4);根据b路标找到位置,然后改变了这个位置的内容(注意,这不是给b重新赋值,而是调用了对象的一个方法,所以b路标指向的位置是没有变化的,就像在该位置又建了一栋楼,于是这儿的环境变了,但是仍然在那个位置)。
    由于a、b路标指向同一个位置,所以你再根据a路标找到位置,内容当然是和b路标指向位置的内容相同。
      

  7.   

    var a=[1,2,3]
    var b=a
    b=100
    alert(a)
    a和b是独立的 这么说能理解吗?还有就是 这个问题的 知识点就是  javascript 的2种类型 基本类型 和 引用类型
    百度
    “javascript 基本类型 引用类型”
      

  8.   

    请看JavaScript高级程序设计第四章,仔细看完理解你就明白了。