现代的前端开发不再是JQ时代的刀和火时代,而是MVVM,组件,工程和越来越复杂的业务逻辑。记忆消费和绩效问题已成为当代开发人员必须考虑的问题。
本文从堆栈内存开始,以便每个人都可以理解JS中变量的内存使用和变化。
首先了解JS中的堆栈和堆栈。记忆空间分为两个区域:堆和堆栈。当代码运行时,解析器将首先确定变量类型。根据变量类型,变量将放置在不同的内存空间(堆,堆栈和堆栈,to。
如图所示
基本数据类型(字符串,数字,布尔值,空,未定义,符号)将分配堆栈区域。它的值是存储在堆栈中的简单数据段,确定数据大小,并且可以分配内存空间;它存储在该值中,因此可以以一个值访问。
数据类型对象(对象)的变量都放置在堆区域中。它保存在堆栈内存中实际上是对象内存中对象的参考地址。通过此参考地址,它可以快速找到保存在堆内存中的对象。存储在堆内存中的对象的大小不同,并且应根据情况执行特定的配置。
以下代码示例:
堆栈区域的功能:较小的空间,简单的数据类型,快速阅读和写作速度,通常由JS引擎自动发布
堆区域的特征:大空间,复杂的数据类型以及略微较差的读写速度。当不引用对象时,它将被周期性回收。
了解记忆的堆栈和堆区域后,让我们看一下变量如何在堆栈和堆积区域中“享受”。
让我们看一下一组基本类型的变量传输:
初始堆栈中A的值为100;其次,将B添加到堆栈区域,然后将A复制到A到B;最后,A节省了另一个值的另一个值,并且B的值不会更改。
让我们看一组参考类型的传输示例:
在上面的代码中,OBJ1和OBJ2指向相同的堆内存,OBJ1分配给OBJ2。实际上,堆栈内存中此内存对象的参考地址已复制到OBJ2,因此OBJ1和OBJ2指针被指向一堆内存。相同的内存。
插图如下:
综合案例:
定位:在JS的可变传输中,可以将其视为本质上的值传输,但是该值可能是基本数据类型或参考地址。如果是一个参考地址,我们通常会说它是传输的。JS是特殊的,不能直接操作对象的内存空间。必须通过指针访问它(So -called Reference)。
因此,即使所有复杂数据类型(对象)的分配操作也可以基本上传输。查看如何在参数中传递不同值。
从上面可以看出,ecmascript中所有函数的参数均按值传递。这意味着该函数外部的值将复制到函数内部的参数,就像从一个变量到另一个变量一样。参数按值,该值被复制到局部变量(参数中的插槽位置)。根据参考参数传递参数时,内存中值的位置将存储在局部变量中,这意味着修改了。局部变量的函数将反映在功能之外。
让我们看一个示例:在条函数中,当参数是基本数据类型时,该函数将在主体中分配一个参数值,而不会影响原始参数的实际值。
如果该功能参与参考类型,则结果将有所不同:
从上面的代码可以看出,如果函数参数是参考类型数据,则在修改函数正文中此参考类型参数的某些属性时,也将修改原始参数,因为此时该功能主体将在主体中引用。地址指向原始参数。
但是,如果对参数的引用在函数中直接修改,则情况将有所不同:
这是因为如果我们重新分配已分配的变量,它将包含新的数据或参考地址。这次,在函数中创建了新的引用,并且任何操作都不会影响原始参数的实际值。
如果对象没有任何变量指向,则JavaScript引擎的垃圾回收机制将破坏对象并释放内存。
答案:{年龄:25},{年龄:50}。由于功能内部,人们的第一个修改等于将Person 1的内存地址复制到人。第二个修改是创建一个新的人变量。因此,将修改Person1的值1,并且人员也是新人变量返回的值
答案:{x:101,y:200},x1是一个干扰项目,因为obj.x是原始类型值,因此在修改后它不会影响原始数据的参考地址。
原始:https://juejin.cn/post/7097229471203196958