理解理解Javascript
01_理解内存分配理解内存分配
在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释
javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深
入,希望大家能接受这种形式,并提供宝贵意见。
原始值和引用值原始值和引用值
在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。原始值指的就是代表原始数据类型(基本数据类型)的
值,即Undefined,Null,Number,String,Boolean类型所表示的值。引用值指的就是复合数据类型的值,即
Object,Function,Array,以及自定义对象,等等。
栈和堆栈和堆
与原始值与引用值对应存在两种结构的内存即栈和堆。栈是一种后进先出的数据结构,在javascript中可以通过Array来模拟栈
的行为
1 var arr = []; //创建一个栈
2 arr.push("apple");//压入元素"apple" ["apple"]
3 arr.push("orange");//压入元素"orange" ["apple","orange"]
4 arr.pop();//弹出"orange" ["apple"]
5 arr.push("banana");//压入元素"banana" ["apple","banana"]
我们来看一下,与之对应的内存图:
原始值是存储在栈中的简单数据段,也就是说,他们的值直接存储在变量访问的位置。
堆是存放数据的基于散列算法的数据结构,在javascript中,引用值是存放在堆中的。引用值是存储在堆中的对象,也就是
说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象。
例:var obj = new Object(); obj存储在栈中它指向于new Object()这个对象,而new Object()是存放在堆中的。
那为什么引用值要放在堆中,而原始值要放在栈中,不都是在内存中吗,为什么不放在一起呢?那接下来,让我们来探索问题
的答案!
首先,我们来看一下代码:
view sourceprint?
01 function Person(id,name,age){
02 this.id = id;
03 this.name = name;
04 this.age = age;
05 }
06 var num = 10;
07 var bol = true;
08 var str = "abc";