基本类型
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 = address
let tow = address
one === 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