js中对象共享传递到底咋理解
b=a,b是a的引用,b=”yu”,b跟a之间的引用打断了,b变成一个字符串。js那个一样,o=100的时候,o就不是a对象了,变成一个数字变量。
■网友
我刚百度了一下,以前一直没注意,然后给你解读一下吧。首先你要明白什么是按值传递(传递的值副本,基础类型或者说值类型的传参方式)和按引用传递(对象的传参方式)吧,对象是存放在内存堆里的,变量的值其实就是一个地址(指向一块内存),你理解的时候分两部分看就明白了,共享传递就是把地址copy一遍传进去,第二个例子里复制一个obj进入函数(把obj当变量看,分两部分看,一部分obj变量地址,一部分实际指向的对象),改变方法里面的obj(叫形参)原obj(实参)不会受到影响,但是,如果改变形参上的某个属性,形参上的属性指向的内存和实参上的属性的内存是共享的,所以就叫共享传递。语文不太好,凑合理解吧。
■网友
在JS和Java中,只有按值传递call by value,并没有按引用传递call by reference。引用类型的变量依然是按值传递的。这是因为引用类型也是一个变量,只是这个变量的值是另一块内存的地址。将引用类型变量传递给函数形参,函数同样会为该形参在栈上开辟新的空间,存放实参中的地址值。因此这依然是按值传递,只不过这个值是地址值而已。只有在C或C++里才有按引用传递。指的是用取地址符取到变量地址,作为实参传递给形参的指针变量。这里的实参是地址常量,不是指针变量。JS和Java里都没有取地址符,就只有按值传递。这一点在Core Java 第一卷里面有说明。不过,JS和Java里虽然没有对地址的直接操作,但是仍然有间接寻址的概念,即通过引用变量改变其地址所指向的内存区。
■网友
这些花里胡哨的定义有的时候欺骗了很多人。
两个知识点:
1、js的赋值过程。
2、函数执行时,传参和实参初始化。
具体代码稍后补充。
■网友
只有C++中才真正区分按地址传递、按值传递。
【js中对象共享传递到底咋理解】 其实在Java、JavaScript中的"按地址传递"、"共享传递",本质上都是"按值传递",注意这个值包含了普通值、地址值。这个地址值是引起混淆的所在!
C/C++中的引用与Java、JavaScript中的引用是完全不同的。
■网友
可以把一个对象拆成3部分1、变量的地址2、值或对象的地址3、对象中储存的值方法传递的是:1和2,即复制1和2的值将其作为参数传入方法中方法1中:function foo(o) { o.x = 3;}改变的是3的部分,3在内存中只有一份,方法内和方法外的2指向同一个3,因此改变了o.x方法2中:function foo(o) { o = 100;}改变的是2的部分,方法内和方法外的2在内存中有2份,改变其中一份并不影响另一份
■网友
对象类型存储在堆里,引用在栈中,第一个实例是引用了obj地址,所以你可以对他进行修改并且改变原型。第二个是让obj不再引用堆中对象而采用栈中number,所以对象没变。
推荐阅读
- 重庆残疾人化身“朗读者”传递阅读力量
- 小区■全民共享发展成果 江苏淮安:老旧小区“华丽转身”
- 未来电子商务的爆发点在哪里
- 汽车|统一纯电动乘用车换电标准及共享换电,或许是大势所趋
- 为啥房多多没像滴滴一样火?
- 趣头条|透过e-tron FE07赛车,奥迪在向我们传递什么信息?
- |徐州:真情解困助力脱贫 共享小康文明成果
- 滴滴优步怎样将私家车运营合法化
- 中国移动采购共享服务中心,有人了解这个中心的情况么,可以介绍一下吗
- 共享充电宝悄悄涨价,你还有“充电自由”吗?
