基本类型和引用类型
5种基本类型:Undefined、Null、Boolean、Number和String 基本类型是按值访问的,所以可以直接操作保存在变量中的实际的值
引用类型的值是保存在内存中的对象,由于JS不能直接访问内存中的位置,所以操作的是对象的引用,为此引用类型的值是按引用访问的。
值的复制
如果从一个变量向另一个变量复制基本类型值,会创建一个新值,并把该值复制到新变量分配的位置上,这两个变量除了值一样以外没有任何联系,可以进行任何操作而不会相互影响。
如果从一个变量向另一个变量复制引用类型值,同样也是把值复制到新变量分配的空间里,只不过这个值是一个指针,这个指针指向储存在堆里的一个对象,所以两个变量实际上引用的是用一个对象,所以对一个变量进行操作会影响另外一个。
传递参数
访问变量有按值和按引用两种方式,而参数只能按值传递,只是把函数外部的值复制给函数内部的参数,和把一个值从一个变量复制到另一个变量一样。
向参数传递基本类型值时,被传递的值会被复制给一个局部变量,传递引用类型值时,这个被传递的值是一个指向对象的指针,所以这个局部变量的变化会影响到函数的外部
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person); //相当于把person的值(指针)复制给obj
alert(person.name); // "Nicholas"
但这并不代表这就是引用传递,我们再在这个函数里增加两条代码
function setName(obj) {
obj.name = "Nicholas";
obj = new Object(); //此时obj指向了新的内存地址,不再和person一致
obj.name = "Greg";
}
var person = new Object();
setName(person); //相当于把person的值(指针)复制给obj
alert(person.name); // "Nicholas"
可以看到,我们修改了obj所指向的对象,并为其定义了新的name属性,但是并没有改变person的name属性,如果是引用传递的话person应该也会指向这个新的对象并且有一个值为Greg的name属性,这说明在函数内部的改动不会影响到原参数。obj所指向的对象只是一个局部对象,会在函数结束时被销毁