javascript值传递和引用传递的问题

问题描述

javascript值传递和引用传递的问题

我看了一篇文章,讲了值传递和引用传递的过程,但是页面最后给出的例子却没有看懂,

 function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);

该段代码中方法里进行了 obj={ } ,obj.name = "test2"; 这两步操作,

为什么person.name的值还是test1呢?

就算是引用传递,那这也已经改了指向的地址了啊,为什么还会是test1呢?

求大牛们给解释一下,不胜感激

解决方案

obj = {}; //已经重新定义覆盖了
对于传参即使按引用传递对象,如果直接在函数中用新值覆盖原先的值,那跟传递进去的对象没关系的。只有改变对象属性,对参数的对象才有影响。
如果学过C,你可以这么理解
内存有一个Person,参数就是执行这个person的指针。如果通过指针.属性,那么肯定也改变了person的属性。但如果对指针重新定义了一个地址,那和原来的person一点关系都没有

解决方案二:

  1. 传递的是地址,这个你没错
  2. obj = {}
    这等于创建一个新的object, 赋给了obj, 只不过内容为空,然后
    obj.name = ...
    你为它添加了一个key/value 就是name=...

此时,内存中有两个object, 一个是原来的person, 而另一个就是在setName中创建的obj, 以我理解,实质上是就两条指针,一条名叫person, 一条叫obj, 你把person的值复制给了obj,然后又创建了一个新的空白object并把它地址给了obj, 所以,现在两条指针指向各自不同的空间。

  1. setName返回,原来的person仍有效, 所以它的name值没错。
  2. 你试一下不用 obj = {}

解决方案三:

是值引用了。。但是你obj={}指向了另外一个新的对象,释放了对原来person对象的句柄,所以下面的test2更新的已经不是obj对象了,而是{}这个新的对象

解决方案四:

javascript中,变量有值访问和引用访问,但参数传递都是值传递(按照professional javascript上的叙述,我比较赞成这种理解)。这在引用类型的变量的传递上特别容易引起困惑。
注意,代码中的形参obj和全局变量person开始都指向同一个对象,但obj={}的执行效果,只是改变了obj变量的指向,而外部的person变量还是指向原来的对象。

解决方案五:

解释有很多,但是原理只有一个。javascript是一门很深的语言。学习起来真的狠不容易。

时间: 2024-08-04 05:07:00

javascript值传递和引用传递的问题的相关文章

请教关于JavaScript中的对象是按照值传递还是引用传递

问题描述 请教关于JavaScript中的对象是按照值传递还是引用传递 function SetName(obj){ obj.name="Tom";//执行之前,此时的obj和Person的name属性均为undefined obj1=new Object(); obj1=obj;//声明一个全局对象,那么obj.obj1和Person此时应该是同一个对象 }//SetName函数执行完之后,obj对象销毁,其余对象仍然存在 Person=new Object();//声明Person

浅谈JavaScript 函数参数传递到底是值传递还是引用传递_javascript技巧

在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备.那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,基本类型的传递: function add(num){ num+=10; return num; } num=10; alert(add(num)); aelrt(num); //输出20,10 对于这里的输出20,10,按照JS的官方解释就是在基本类型参数传递的时候,做了一件复制

深入分析C++ 值传递、指针传递、引用传递

而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 指针与引用的相同点与不同点: ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不

源自一个面试的问题:字符串在函数的参数中是当成值传递还是引用传递。

问题描述 源自一个面试的问题:字符串在函数的参数中是当成值传递还是引用传递.这是测试方法: public void setA(String a) { System.out.println("In the setmethod before set:解决方案二:# " + a); a = "I am a student"; System.out.println("In the setmethod after set:解决方案三:# " + a); }

Java值传递和引用传递

先明晰一下文中值传递和引用传递的含义(关于对引用的定义的争议请参考评论区). 值传递:方法调用时,实参把它的值传递给对应的形参(或者说副本),方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实参的引用(地址,而不是参数的值)被传递给方法中相对应的形参,在方法执行中,对形参的操作实际上就是对实参的操作,方法执行中形式参数值的改变将会影响实际参数的值. 两个看似没什么区别的代码 代码一 public static void main(String[] args)

对象-java传递 ”值传递和引用传递“还是全部 “值传递”

问题描述 java传递 "值传递和引用传递"还是全部 "值传递" 若说值传递.基本类型是copy的值赋给形参,对象是把 堆中对象的 地址 传给 形参. 若说分为值传递和引用传递..引用传递 是因为这个传的地址,导致实参和形参 操作的都是同一块内存. 有点乱,像文字层次上的撕逼.. 若往引用传递方面思考,C++的指针又把我搅乱了.,java里不能直接管理内存,传递的不是 变量本身 的栈地址.而是变量的内容(值) 解决方案 java没有什么值传递引用传递,都是传递对象引

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

java的值传递和引用传递

java的值传递和引用传递 1. "="是赋值操作. 任何包含=的如+=.-=. /=等等,都内含了赋值操作. 不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说, = 是一个动作,一个可以改变内存状态的操作,一个可以改变变量的符号,而+ - * /却不会. 这里的赋值操作其实是包含了两个意思: 1.放弃了原有的值或引用: 2.得到了 = 右侧变量的值或引用.Java中对 = 的理解很重要啊!!可惜好多人忽略了,或者理解了却没深思过. 2. 对于

Java中的值传递和引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?     答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的. Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言).