首先说说变量,JavaScript变量可以用来保存两种类型的值:基本类型和引用类型。
1,基本类型很好理解,源于基本数据类型:underfined,null,boolean,number和string。也就是简单的数据段,基本类型在内存中占据固定大小的空间,因此保存在栈内存中,提到栈内存,就想到了进栈出栈压栈,先进后出。下图是栈模型,后面会具体写一篇数据类型的随笔。
,
2,基本类型从一个变量向另一个变量时,会创建这个值的副本。
var a1=8;
var a2=a1;
a1是8,a2也是8,它的内存方式就像上面栈模型一样,a1在栈底,a2在它的上面,a1和a2是完全独立,所以对这两个变量操作相互不会影响。
3,引用类型,保存的值是对象,保存在堆内存中,它可以添加修改删除属性和方法。
var person = new 0bject();
person.name="cqy";
console.log(person.name); //"cqy" var person = "cqy";
person.age="23";
console.log(person.age); //underfined
上面我声明了一个对象person,添加一个name属性,赋值为cqy,打印出来name值为cqy,说明成功添加属性name并赋值,而下面字符串就不能增加属性。
4,引用类型,当一个变量向另一个变量复制引用类型的值时,同样也会把值赋给新的变量中,这个值实际上是个指针,指针指向存储堆中的一个对象,
我个人理解啊,堆内存可以说是个完全二叉树,这个我们把这个堆内存,看成一堆,也就相对一个盒子,在盒子里面有多个对象,复制前变量和复制后变量都指向堆里面同一个object对象,所以说这个值,实际就是个指针。所以改变一个变量就会影响到另一个变量。举例说明:
var object1 = new Object();
var object2 = object1;
object1.name="cqy";
alert(object2.name); //值为"cqy"
5,传递参数,说白了也就是一个变量向另一个变量赋值,只不过这是从函数外部赋值到函数内部的过程。
注意,在传递参数时只能按参数传递,而不能用引用传递。
function setName(obj){
ocj.name = "cqy";
obj = new Object();//在局部重新定义一个对象,
obj.name = "jbname";//定义了一个不同的name
}
var person = new Object();
setName(person);
alert(person.name);
//如果按引用传递,person会自动修改为指向其name属性值为"jbname".
//这就说明原始的引用依然保持不变,内部重写obj会在函数执行后立即销毁。