JavaScript的堆栈和简单类型、复杂类型

JavaScript的堆栈和简单类型、复杂类型

类型

简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。

简单类型:在存储时变量中存储的值就是本身,因此叫做值类型。值类型的数据有 string 、number、boolean、undefined、null

复杂类型:复杂数据类型在存储变量时存储的仅仅是地址(引用),因此叫做引用数据类型通过new关键词创建对象(系统对象、自定义对象),复杂类型有 Object、Array、Date 等

堆和栈

堆栈空间分配:

栈:由操作系统自动分配释放的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。简单数据类型存放在栈内存中。

堆:存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂类型的数据存放在堆内存中。

注意:JavaScript本身没有堆栈的概念,所谓堆栈只是通过其他语言来更好的来理解JavaScript的存储机制。

var a = 10
function fn(x){
    x++
    console.log('打印x', x)
}
fn(a)
console.log('打印a', a)
// 打印 x= 11
// 打印 a= 10
// 由于a是值类型,在内存中使用的是栈空间有自己的存储地址。所以在函数中x + 1 只改变了函数内的变量x自己对应存储空间的值,在函数外部a对应存储空间的值并未更改,打印a还是原来的值10
var obj = { num: 20}
function fn(x){
    x.num++
    console.log('打印x=', x)
}
fn(obj)
console.log('打印a=', obj)
// 打印x= { num: 21 }
// 打印a= { num: 21 }
// 由于obj是复杂类型在内存中使用的是堆空间没有单独存储地址,在函数fn中的x和外面的obj共享一份存储空间。因此函数中改变了x.num对应存储空间的值,实际也就是改变了obj对应的存储空间的值,因此外面的obj对象的值也会随之改变。
var a = []
var b = []
console.log('打印', a === b)
// 打印 false
var a = {}
var b = {}
console.log('打印', a === b)
// 打印 false
// 在使用复杂类型数据时,两个变量不能直接用 === 号来做比较。 由于比较麻烦一些,这个后续研究后更新文章

猜你喜欢

转载自www.cnblogs.com/liea/p/12514237.html