大家好,今天小编关注到一个比较有意思的话题,就是关于javascript分堆栈吗的问题,于是小编就整理了1个相关介绍JavaScript分堆栈吗的解答,让我们一起看看吧。
javascript中函数都是值传递吗?
JavaScript中,传递变量就是值传递,如果传递一个对象那就是引用传递,话不多说,上代码:
值传递
调用fun函数并传递变量a,在函数内部传递的参数a自加1后,全局变量a的值任然是5,说明参数传递过程中,只是将a的值传递过去了,属于值传递。
引用传递
对象obj的属性age原始值为20,调用函数,并传递obj,在函数内部改变_obj对象的age属性值为30,调用函数后,再输出obj对象的age属性,发现其值也跟着改变为了30,说明参数对象_obj与obj在内存中,指向了同一地址区域,属于引用传递。
是的,J***aScript中函数都是值传递,哪怕是object类型的参数也是一样,不过此时这个值就变为该object的地址值了,这块儿容易造成误解,因此要格外注意!
下面我们具体看一下:
// 现在obj 和 person 指向内存中的同一块地址1
obj.name = "人生之路慢慢长";
obj.fensi = 800;
// obj 指向了新对象所在的地址2,切断了和地址1的联系
obj = new Object();
obj.fensi = 100000;
}
var person = new Object();
setName(person);
console.log(person.name); // 人生之路慢慢长
console.log(person.fensi); // 800
从上面的例子我们可以看到,person已经被赋予"人生之路慢慢长"的名字,我们来分析下,当我们把 person 的地址值传递给 obj 之后,obj 和 person 都指向了内存中的同一块地址1,所以这里对 obj 进行添加或删除属性的操作,都是在地址1上操作的,那么name属性以及fensi属性就会被赋予到person上了(使用我自己的账号来举个栗子,(✪ω✪))。
后面又修改了一次obj的fensi属性,但是为何最后fensi不是100000还是800呢(我倒希望是100000啊,哈哈)?关键点就在于“obj=new Object()”对 obj 重新赋值这句上, 这时候会切断了 obj 和地址1之间的联系,所以对 obj 上的任何操作也不会反映到 person 对象上。如果函数的参数是按引用传递的话, person 也会跟着指向地址2 , 然而事实上 person 指向的还是地址1,最终fensi还是之前的800而不是100000啦。
这点儿很容易搞混,所以大家要格外注意,在实际使用中不断强化,填好这个坑。大家如果觉得不错欢迎点赞哦,或者还有什么想法可以评论,大家一起讨论学习。
值传递在不同层面有不同的意义!
你可以认为J***aScript的函数调用参数都是值传递,也可以认为分值传递和引用传递两种!这两种情况下<span style="font-weight: bold;">值传递的含义并不同,但是后者是大部分程序员最先接触的。
如果你能明白我下面说的,就不会再在这上面困惑,换到其它语言也同理。
语言设计层面
J***aScript的类型设计里有基本类型(值类型)和引用类型两种,基本类型分配在堆栈,或者依附于引用类型存储在堆中。看到值类型存储在堆中,估计很多人就要开始吐槽了!但是要冷静,从内存角度好好想一想引用类型的实例到底是什么?它不过是一堆值类型和内嵌其它引用类型的组合而已。这样递归想下去,你会明白,最终的数据都是靠基本的值类型来承载的。也就是堆里面除了少部分引用对应的数据结构,大部分都是值类型数据。在考虑值类型和引用类型的区别时,你考虑过这点么?
从语言层次表现上来看:函数的参数传递,值类型会被复制一份,引用类型的引用会被***一份,此时两个引用指向同一个副本。如果你访问或修改引用类型的数据字段,实际上修改的是同一份数据。这个比较容易理解吧?
所以从这个层面上可以说分值传递和引用传递两种。这里的值传递和引用传递其实包含了语言特性在里面。
函数调用角度
***设我们不理会语言对于基本类型或者值类型的设计,单单从函数调用角度看呢?
通过上面的描述,你已经知道,值类型被***了一份,引用也被***了一份,从函数自身的角度出发,它只完成了***功能,对于基本类型,它***基本类型代表的数据,对于引用类型,它***引用类型的引用(如果放在C语言,把引用换成指针可能更直观)。
本质上来看,函数调用在参数处理这一块,只做了***处理,所以你可以说它是值传递。只不过这里的值其实包含了上面语言层面的两个东西:值类型的值、引用或指针。
总结
统一概念的内涵是我们程序员碰到的最大问题,这里的值传递就是典型的问题。本质只有一个,但是大家站在不同角度,不同层次,就会赋予概念不同的内涵,如果内涵都不同,就来讨论结论问题,是没有结果的。
到此,以上就是小编对于j***ascript分堆栈吗的问题就介绍到这了,希望介绍关于j***ascript分堆栈吗的1点解答对大家有用。
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系邮箱:83115484@qq.com,我们会予以删除相关文章,保证您的权利。 转载请注明出处:http://www.fengdengtech.com/post/67167.html