js基本数据类型与引用数据类型区别

3,229 阅读2分钟
  • 图解
    栈&堆

基本类型数据的变量直接存在栈中,而引用数据类型的变量,其地址存在栈中,数据存在堆中,通过栈中的这个地址访问堆内的数据。

基本数据类型

引用数据类型

  • 常见有:Array(数组),Object(对象)

上述图解内容配有以下代码段:

<script>
    var a=1;
    var b=a;
    b=3;
    console.log('a='+a,'b='+b);
    // a=1 b=3
    var arr1 =[1,2,3];
    var arr2=arr1;
    arr2=[5,4,3,2,1];
    console.log('arr1:',arr1);
    console.log('arr2:',arr2);
    // arr2=arr1=[5,4,3,2,1]
    var obj1 ={
      name :'xiaoming',
      age: 18,
    }
    var obj2 =obj1;
    obj2.age=20;
    console.log('obj1:',obj1);
    console.log('obl2:',obj2);
    // obj1.name=obj2.name='xiaoming'
    // obj1.age=obj2.age=20
  </script>
  • 即引用数据类型的变量,其变量名实际上是一个指针,和基本数据类型的变量一起存放在栈内存中,而这个指针指向堆内存中的一块内存,对引用数据类型的变量的操作实际上是通过指针,对堆内存的这些数据进行修改。所以通过赋值符号进行赋值的引用数据类型变量,实际上只是将指针赋值给了这个新的变量,使其指向同一块堆内存而已。

如果使用赋值符号(=)进行了重新赋值,即改变了引用数据类型变量的地址

    var obj1={
        name: 'qiqi',
        age: 17 
    }
    var obj2 = obj1
    obj1 = {
        name: 'xiaosi'
        age: 19
    }
    console.log(obj1)
    //obj1 = {name: 'xiaosi',age: 19 }
    //obj2 = {name: 'qiqi',abe: 17}

补充:

js 弱数据类型的语言 / php

java c c++ go 强数据类型的语言

用var关键字定义一个变量

typeof 判断基本数据类型/引用数据类型 返回的是一个字符串

  • undefined 变量声明以后未赋值 typeof -> undefined
  • null 空对象 typeof -> object
    var num_1 = 1;
    var str = 'dnf';
    console.log(typeof num_1) // number
    console.log(typeof str) // string

判断数组/对象的方法

  • 由于type(Object/Array) => Object 所以判断数组还是对象时,用下面两种方法
  1. obj.constructor =>判断是通过什么构造方法创建的(reutrn Object/Array)
  2. arr instanceof Array 判断 arr 是否是 Array的 一个实例化对象(return true/false)浅拷贝&深克隆-掘金手记