JS变量小总
Posted angxf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS变量小总相关的知识,希望对你有一定的参考价值。
变量分类:
1、栈内存(stack)和堆内存(heap)
2、基本类型和引用类型
#栈内存(stack)
一般为静态分配内存,其分配的内存系统自动释放。
#堆内存(heap)
一般为动态分配内存,其分配的内存,系统不释放,哪怕程序退出,那一块还是在那里。
#为何会有栈内存和堆内存之分
1、 和垃圾回收机制有关。为了使程序运行时占用的内存最小;
2、 当一个方法执行时,每个方法都会建立自己的栈内存,在这个方法内定义的变量将会逐个放入这块栈内存中,随着方法的执行结束而销毁;
3、 当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用,这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的传递参数时很常见),则这个对象依然不会被销毁,只有当一个对象内有任何引用变量引用时,系统的垃圾回收机制才会在核实的时候回收它;
*基本类型五类:
Number、String、Null、Undefined、Boolean,这些类型在内存中分别占有固定大小的空间,它们的值保存在栈空间,我们是通过值来访问的;
*引用类型:
Array、Date、Math、RefExp、Function等Object对象(指保存在堆内存中的对象);引用类型,值大小不固定,栈内存中存放地址指向堆对象。
#简单说明:
栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值不固定,因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。
基本类型和引用类型的区别
实际区别是传值与传址;
%传值:
%传址:
&浅拷贝:
浅拷贝指只是复制一层对象,当对象的属性是引用类型的时,实质复制的是其引用地址,两个对象指向同一个内存地址时修改其中任意值,另一个值也会随之改变;(在定义一个对象或数组时,变量存放的往往只是一个地址。当我们使用对象拷贝时,如果属性是对象或数组时,这时我们传递的也只是一个地址。因此子对象在访问该属性时,会根据地址回溯到父对象的堆内存中,此时父子对象发生了关联,两者的属性值会指向同一存储空间;)
&深拷贝:
深拷贝是指复制对象的所有层级,将对象及其值都复制过来,两个对象修改其中任意的值另一个值不会改变。
&深拷贝的实现方法:
1、 通过递归方法实现;
2、 通过JSON解析实现;对象转成JSON字符串再转成JSON对象:JSON.parse( JSON.stringify(o) );
以上是关于JS变量小总的主要内容,如果未能解决你的问题,请参考以下文章