有内存说明更好JavaScript高级教程中说对象传递参数是按值传递的,想问一下大佬是怎么理解这个的。

解决方案 »

  1.   

    书上写的有问题,对象传递参数是按引用传递的,即传递的是内存地址刚开始变量 obj 指向 person对像的内存地址,然后 obj = new Object()  后,obj 指向了新的内存地址,此时obj 和 person对象的内存地址就不是同一个了,所以person.name 还是 Nicholas 。
      

  2.   

    作者在前一页已经说明了,虽然传的是值类型,但是会引用原对象的地址,但如果将这个参数重新赋值为另外一个对象(不管是new Object()这类的还是基本类型),则会断开对原对象的引用,而不是将原对象一起改变
      

  3.   

    作者说Javascript里只有传值的,我们通过C#来看看,参数带ref的是传址的,不带的和Javascript里的是一样的
    先看看结果:
    下面是代码:
        class Program
        {
            static void Main(string[] args)
            {
                var user = new User() { Age = 20, Name = "张三" };
                Console.WriteLine("初始化:" + user.ToString());
                tt(user);
                Console.WriteLine("after tt:" + user.ToString());            t2(ref user);
                Console.WriteLine("after t2:" + user.ToString());
                Console.ReadKey();
            }        static void tt(User user)
            {
                user.Age = 30;
                user = new User() { Age = 50, Name = "李四" };
                Console.WriteLine("tt new:" + user.ToString());
            }        static void t2(ref User user)
            {
                user.Age = 60;
                user = new User() { Age = 50, Name = "王五" };
                Console.WriteLine("t2 new:" + user.ToString());
            }        class User
            {
                public string Name { get; set; }
                public int Age { get; set; }            public override string ToString()
                {
                    return string.Format("姓名:{0},年龄:{1}", Name, Age);
                }
            }
        }
    更多的可以参考这里