<script type="text/javascript">
    function setName(obj) {
        obj.name = "xiaobai";
        obj = new Object();
        obj.name = "xiaohei";
    }
    var dog = new Object();
    setName(dog);
    alert(dog.name);
    /*输出 
    *xiaobai 
    */
</script>
我想不通为什么输出的是“xiaobai”,应该是“xiaohei”吧。javascript

解决方案 »

  1.   

    function setName(obj) {
            obj.name = "xiaobai";
    var x=obj;
            obj = new Object();
            obj.name = "xiaohei";
    alert(x===obj);
        }
        var dog = new Object();
        setName(dog);
        alert(dog.name);
    可能是因为第一次的时候obj是指向dog的对象  
    而重新new Object后obj不再指向dog   所以修改也不是修改dog对象  所以输出xiaobai
      

  2.   


    看注释记住在面向对象的时候 
    变量  和 实际对象  是2个东西
    var a  = new Object; //创建了一个 变量a 和一个 对象object  同时a指向了object
    a.name = 'xxx';       //这个时候 .运算符 是对 a指向的 object的操作
    a = new Object();    //这个时候是对 a变量本身的操作 a指向了你又创建的一个新对象 这个时候有 2个object 但是a指向第2个
      

  3.   

    function setName(obj) {          // obj变量 指向 dog
            obj.name = "xiaobai";    //给obj属性赋值
            obj = new Object();      //obj指向新对象
            obj.name = "xiaohei";    //给obj属性赋值
        }
      

  4.   

    楼主这个例子可以用来阐释“js中参数是按值传递而不是引用传递”。
    具体到你的代码:
    setName(dog)的具体执行步骤是:
    0 函数开始:
    1 (setName(dog))=>复制变量dog的指针给obj,使得obj和dog共同指向(引用)同一个对象(即你创建的那个空对象)。
    2 (obj.name = "xiaobai";)=>给obj和dog共同引用的空对象添加值为“xiaobai”的name属性。
    3 (obj = new Object();)=>切断obj和原对象之间的联系,让obj引用一个新的空对象。这里要注意的是:虽然obj不再引用原对象,但是dog和原对象之间的联系并未切断,因此dog仍然保持者对原对象的引用,只不过此时的原对象具有了一个值为“xiaobai”的name属性。
    4 (obj.name = "xiaohei";)=>因为obj现在引用的是一个新的空对象,所以这一步是给新对象添加name属性,属性值“xiaohei”
    5 函数执行完毕。所以在函数执行完后,dog引用的依然是原来的对象,自然会弹出“xiaobai”。所谓“按引用传递”本质上是:给参数传值得变量和参数是相互独立的。(个人理解 仅供参考)