基本类型
1、number
2、string
3、boolean
4、symbol
5、undefined
6、null
基本类型的比较就是值的比较;访问是访问值本身;不能定义方法和属性;保存在栈内存中
引用类型
JavaScript除了基本类型外,就是引用类型了。如Array、Function、Object、Date等等。
引用类型可以定义属性和方法;同时保存在栈内存和堆内存中;引用类型的比较是内存地址的比较。
- 为什么说引用类型同时保存在栈内存和堆内存中
let person = {name:'louis'}//person保存在栈内存中,person就是这个引用对象的指针,通过这枚指针寻找到堆内存的地址 //{name:'louis'} 保存在堆内存中
- 引用类型是如何比较的
let address = {details:'a'}let one = addresslet tow = addressone === tow //true// 虽然one、tow是两枚不同的指针,但它们都同时指向了堆内存里的address的内容,所以它们是相等的
再来一个例子
let person = {name:'louis}let man = {name:'louis'}person === man //false// person和man的内容明明相同,为什么又不相等是因为她们的内容虽然一样,但是是在堆内存里开辟了两个地方,所以它们指向的也是两个不同的地方。可见,引用类型的比较是内存地址的比较
函数参数是引用类型(对象)的时候会发生什么
还是一个例子
function test(person) { person.age = 26 person = { name: 'aaa', age: 30 } return person}const p1 = { name: 'bbb', age: 25}const p2 = test(p1)p1 // {age:26,name:'bbb'}p2 // {age:30,name:'aaa'}
函数传递参数时,实际上是传递指针的副本。
test(p1)实际上传递的就是p1的副本,这时指针仍然指向{name: 'bbb',age: 25}
person.age = 26 这时修改的还是原来内存位置的内容,所以这时p1的age变成了26
当person = {} .. 相当于重新开辟了一块堆内存,赋值{name:'aaa',age:30},最后返回这个对象,而这个对象的指针就是p2