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

新新的人类 2019-08-08 04:12:57
有内存说明更好JavaScript高级教程中说对象传递参数是按值传递的,想问一下大佬是怎么理解这个的。
...全文
185 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2019-08-10
  • 打赏
  • 举报
回复
Hello World, 2019-08-10
  • 打赏
  • 举报
回复
作者说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);
}
}
}


更多的可以参考这里
cn00439805 2019-08-08
  • 打赏
  • 举报
回复
引用 4 楼 Hello World, 的回复:
作者在前一页已经说明了,虽然传的是值类型,但是会引用原对象的地址,但如果将这个参数重新赋值为另外一个对象(不管是new Object()这类的还是基本类型),则会断开对原对象的引用,而不是将原对象一起改变
我并不认同按值传递,临时复制一个变量是对的,但复制的变量还是引用类型,和被复制的都是引用类型,所以按我理解就是按地址传递。
Hello World, 2019-08-08
  • 打赏
  • 举报
回复
作者在前一页已经说明了,虽然传的是值类型,但是会引用原对象的地址,但如果将这个参数重新赋值为另外一个对象(不管是new Object()这类的还是基本类型),则会断开对原对象的引用,而不是将原对象一起改变
cn00439805 2019-08-08
  • 打赏
  • 举报
回复
书上写的有问题,对象传递参数是按引用传递的,即传递的是内存地址 刚开始变量 obj 指向 person对像的内存地址,然后 obj = new Object() 后,obj 指向了新的内存地址,此时obj 和 person对象的内存地址就不是同一个了,所以person.name 还是 Nicholas 。
新新的人类 2019-08-08
  • 打赏
  • 举报
回复
这本书说是按值传递,我硬是没弄眀自?
scscms太阳光 2019-08-08
  • 打赏
  • 举报
回复
对象嘛都是引用地址,每个地方修改都是修改同一个内存堆里的对象。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧