【JavaScript基础】数据类型的理解

72 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

上一篇文章讲述了js的数据类型有哪些,今天谈谈对数据类型的简单理解。

基本数据类型的值指的是简单的数据段,引用数据类型指的是可能有多个值构成的对象。可以从下面几个方面来理解:

1. 值的存储

基本数据类型的值存储在栈中; 引用数据类型的值存储在堆中,同时在栈中会有相应的堆地址(指针),指向堆的位置。

2. 值是否可变?是否可以动态改变属性?

定义基本数据类型和引用数据类型的值,都是创建一个变量并为该变量赋值。

基本数据类型的值无法改变; 引用数据类型的值可以改变,可以为其添加、改变和删除其属性和方法。

var person = new Object(); //创建一个对象并将其保存在变量person中
person.name = "Song"; //为该对象添加一个名为name的属性,并赋值为Song
console.log(person.name); //访问name这个属性 结果为Song

3. 赋值

一个变量向另一个变量复制(基本数据类型或引用数据类型的)值时,两则的区别:

  • 基本数据类型的值

    当变量赋值时,会重新创建一个新值将其复制到为新变量分配的位置上,此时两个变量各自拥有属于自己的独立的内存空间,因此两者可以参与任何操作而不会相互影响。

    var a = 1;
    var b = a;
    b = 2;
    console.log(a);//1
    console.log(b);//2
    
  • 引用数据类型的值

    当复制引用数据类型的值时,复制的不是堆内存中的值,而是将栈内存中的地址复制过去,复制操作结束后,两个对象实际上都指向堆中的同一个地方。因此改变其中一个对象(堆中的值改变),那么会影响到另一个对象。

    var obj1 = {
      name:"Song"
    };
    var obj2 = obj1;
    obj2.name = "D"; //改变obj2的name属性的值,则将obj1的也改变了
    console.log(obj1.name);// D 
    

4. 传参(函数的形参可以看做是一个变量)

  • 基本数据类型传参

    当我们把一个基本类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。

  • 引用数据类型传参

    当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

    function test(person){
        person.age = 26;
        person = {  //重新开辟了一个内存空间,然后将此内存空间的地址赋给person,可以理解为将刚才指向p1的指针地址给覆盖了,所以改变了person的指向
          name:'张三',
          age:30
        }
        return person
    }
    const p1 = {
      name:'李四',
      age:25
    };
    const p2 = test(p1);//将p1的内存地址指针复制给了形参person,两者引用的是同一个对象,这个时候在函数中改变变量,就会影响到外部。
    console.log(p1);//{name: "李四", age: 26}
    console.log(p2);//{name: "张三", age: 30}