首先明确:数据类型一共分为两种,一种是基本数据类型(也叫简单数据类型),另一种是引用数据类型(也叫复杂数据类型)
基本数据类型包括:Number、String、Boolean、Null、Undefined
引用数据类型包括:对象数据类型、函数数据类型和引用数据类型。
两种数据类型的区别主要体现在四个方面:1.存储 2.赋值 3.比较 4.传参
一、存储方面的区别
首先明确:首先明确,变量的数据存储的地方是内存中,内存分为栈内存和堆内存。
- 基本数据类型
- 基本数据类型存储在栈内存中
- 引用数据类型
- 引用数据类型是将数据本体存放在堆内存中,然后将指向该内存的地址,存放在数组名或者对象名或者函数名中。而这个数组名、对象名、函数名存放在栈内存中。
引申面试题:数据类型之间有什么区别
回答:
- 数据类型分为基本数据类型和引用数据类型。基本数据类型包括number、string、boolean、undefined、null,他们一般存储在栈内存中;引用数据类型包括函数、对象、数组,他们的数据本体存储在堆内存中,变量名存储位置是栈内存中。
- 基本数据类型内部存储的是值,引用数据类型内部存储的是地址。
二、赋值
- 基本数据类型
- 赋值以后两个变量之间没有任何关系,不会相互影响。
- 例如:考试,我的卷子复制一份给你,你在你的卷子上书写,并不会影响我的卷子。
var num1 = 1
var num2 = num1
num2 = 3
console.log(num1) //num2被重新赋值为3,此时num1的值不会随着num2的改变而改变,还是1
- 引用数据类型
- 因为变量内部存储的是指向堆内存的地址,所以在赋值的时候就是将这个地址给到了另一个变量。(就相当于这两个变量存储的是同一把钥匙,所以操作其中一个变量的时候,另一个变量也会受到影响。)
- 例如:我的房门钥匙,复制一把给你,我们共同拥有同一个房间的钥匙。如果我对房间进行修改,你进入房间也会看到布局的修改。
var obj1 = {
name:'abc',
age:18
}
var obj2 = obj1
//这一步相当于将obj1内部存储的“钥匙”,给到了变量obj2,那么此时obj1和obj2相当于操作同一个内存空间
obj2.name = 'ABC'
//此时相当于同时修改了obj1和obj2内部存储的值,它们内部的name值都变为了ABC
三、比较(结果为trur或者false)
- 基本数据类型
- 基本数据类型比较的是值(但是也需要注意‘===’同时比较的值和数据类型,‘==’只比较值)
console.log(100 === 100) //结果为true
console.log(100 === ‘100’) //结果为false
- 引用数据类型
- 引用数据类型比较的是存储地址
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
四、传参
- 基本数据类型
- 将值拷贝一份传递给形参,在函数内修改不会影响外界
function fn(num){
num = '100'
}
var str = 'abc'
fn(str)
console.log(str)
// ‘abc'属于基本数据类型,所以在传参时,函数内部的值不会影响外部,故返回值为:abc
- 引用数据类型
- 将存储地址赋值给形参,在函数内部修改会影响外界
function fn(o){
o.name = 'abc'
}
var obj = {
name:'ABC'
}
fn(obj)
console.log(obj.name)
// obj属于引用数据类型,在函数内部修改会影响外界的值,所以返回值为:abc