js值类型与引用类型

一.值类型与引用类型

1.值类型(基本数据类型)

  • 数值类型
  • 布尔类型
  • undefined
  • null
  • 字符串
    值类型是存储在栈(stack)中的简单数据,也就是说,它们的值直接存储在变量访问的位置。
 var num = 10;
var str = "hello JS";
var flag = true;
var un = undefined;
var nu = null;

*上面定义的这些值类型的数据在内存中的存储如下 *

image.png

2.引用类型(复合数据类型)

  • 对象
  • 数组
  • 函数
    存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
 var arr = [1, 2, 3];
 var p1 = {name:"张三", age:18};
 var p2 = {
    name:"李四",
    age:50,
    son:{
        name:"李小一",
        age:18
    }
};

 var p3 = {
    name:"王五",
    age:50,
    children:[
        {
            name:"王小一",
            age:20
        },
        {
            name:"王小二",
            age:15
        },
        {
            name:"王小三",
            age:12
        }
    ]
}

*上面定义的这些值类型的数据在内存中的存储如下 *
image.png

二.值类型与引用类型的赋值

1.值类型的赋值

直接将存储的数据复制一份进行赋值,两份数据在内存中是完全独立的

var num1 = 10;
var num2 = num1;

下面两句代码在内存体现为;
image.png
* var num1 = 10;表示变量num1存储的是数字10
* 将数据拷贝一份,也就是将10拷贝一份,这个时候内存中有两个10
* 将拷贝的10赋值给num2

2.引用类型赋值

引用类型赋值的时候,是将变量中存储的地址复制一份单独存储,但是两个变量共享同一个对象。修改其中一个对象,另外一个引用来访问的时候,也会访问到修改后的对象

var p = {name:"张三", age:19};
var p1 = p;

上面两句代码在内存中的体现
image.png
* var p = {name:”张三”, age:19};,p中存储的是对象的地址
* 赋值就是将变量p中存储的数据,也就是地址拷贝一份, 然后将该数据赋值给p1
* 此时内存中只有 1 个对象,变量p和p1同时指向这个对象
实例

var obj = {
        name : "宅男"
    };
    function jinhua(param){
        //param = obj
        param.name = "高富帅";
        //下面的这句代码,重新创建了一个对象,修改了param的指向
        //但是,obj还指向原来的那个对象 所以,在修改param的时候,修改的是
        //新创建的对象,跟obj没有关系
        param = {
            name:"腐女"
        };  //新的对象,新的地址 故下一个param.name指向这个新地址
        param.name = "宅男";
    }
    jinhua(obj);
    console.log(obj.name); //高富帅 or  宅男 or  腐女

三.总结

  • 值类型做函数的参数
    函数内部的变量,也就是形参和实参只是简单的赋值操作,两个数据独立存储于内存中的。在函数内部对形参进行修改,不会影响外面的变量。

  • 引用类型做函数的参数
    还是把实参存储的地址赋值给了形参,在函数内部,形参同样也指向该对象,所以,在函数内部对该对象进行修改,会影响到外面的变量。

  • 注意:如果在函数内部重新创建对象,为该形参赋值,那么两个对象将不再有关系
    修改其中一个,另外一个不受影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值