JavaScript中基本/引用类型与参数传递

基本类型和引用类型

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所指向的对象只是一个局部对象,会在函数结束时被销毁 

猜你喜欢

转载自blog.csdn.net/qq_42265289/article/details/81133615