九、数据类型之间的区别

245 阅读3分钟

首先明确:数据类型一共分为两种,一种是基本数据类型(也叫简单数据类型),另一种是引用数据类型(也叫复杂数据类型)

基本数据类型包括:Number、String、Boolean、Null、Undefined

引用数据类型包括:对象数据类型、函数数据类型和引用数据类型。

两种数据类型的区别主要体现在四个方面:1.存储 2.赋值 3.比较 4.传参

一、存储方面的区别

首先明确:首先明确,变量的数据存储的地方是内存中,内存分为栈内存和堆内存。

  1. 基本数据类型
  • 基本数据类型存储在栈内存中
  1. 引用数据类型
  • 引用数据类型是将数据本体存放在堆内存中,然后将指向该内存的地址,存放在数组名或者对象名或者函数名中。而这个数组名、对象名、函数名存放在栈内存中。

引申面试题:数据类型之间有什么区别

回答:

  • 数据类型分为基本数据类型和引用数据类型。基本数据类型包括number、string、boolean、undefined、null,他们一般存储在栈内存中;引用数据类型包括函数、对象、数组,他们的数据本体存储在堆内存中,变量名存储位置是栈内存中。
  • 基本数据类型内部存储的是值,引用数据类型内部存储的是地址。

二、赋值

  1. 基本数据类型
  • 赋值以后两个变量之间没有任何关系,不会相互影响。
  • 例如:考试,我的卷子复制一份给你,你在你的卷子上书写,并不会影响我的卷子。
var num1 = 1
var num2 = num1
num2 = 3 
console.log(num1)   //num2被重新赋值为3,此时num1的值不会随着num2的改变而改变,还是1
  1. 引用数据类型
  • 因为变量内部存储的是指向堆内存的地址,所以在赋值的时候就是将这个地址给到了另一个变量。(就相当于这两个变量存储的是同一把钥匙,所以操作其中一个变量的时候,另一个变量也会受到影响。)
  • 例如:我的房门钥匙,复制一把给你,我们共同拥有同一个房间的钥匙。如果我对房间进行修改,你进入房间也会看到布局的修改。
var obj1 = {
      name:'abc',
      age:18
    }
    var obj2 = obj1   
//这一步相当于将obj1内部存储的“钥匙”,给到了变量obj2,那么此时obj1和obj2相当于操作同一个内存空间
  obj2.name = 'ABC'  
//此时相当于同时修改了obj1和obj2内部存储的值,它们内部的name值都变为了ABC

三、比较(结果为trur或者false)

  1. 基本数据类型
  • 基本数据类型比较的是值(但是也需要注意‘===’同时比较的值和数据类型,‘==’只比较值)
console.log(100 === 100)    //结果为true
console.log(100 === ‘100’)  //结果为false
  1. 引用数据类型
  • 引用数据类型比较的是存储地址
var obj1 = {
      a:100,
      c:5
    }
var obj2 = {
      a:100,
      c:5
    }
console.log(obj1 === obj2)  //false,因为这两个对象的地址不一样,所以不相等

var obj3 = {
      a:100,
      b:200
    }
var obj4 = {
      a:100,
      b:300
    }
obj4 = obj3
    console.log(obj3 === obj4) //true,因为最后一步使obj3和obj4的地址相同,所以返回结果是true

四、传参

  1. 基本数据类型
  • 将值拷贝一份传递给形参,在函数内修改不会影响外界
function fn(num){
      num = '100'
    }
var str = 'abc'
fn(str)
console.log(str)
// ‘abc'属于基本数据类型,所以在传参时,函数内部的值不会影响外部,故返回值为:abc
  1. 引用数据类型
  • 将存储地址赋值给形参,在函数内部修改会影响外界
    function fn(o){
      o.name = 'abc'
    }
    var obj = {
      name:'ABC'
    }
    fn(obj)
    console.log(obj.name) 
    // obj属于引用数据类型,在函数内部修改会影响外界的值,所以返回值为:abc