值类型和引用类型
值类型(基本数据类型):boolean null undefined number string
引用类型(复杂数据类型): 常用: 数组,函数,对象
值类型和引用类型的区别
- 数据内存分配
值类型的数据都会存放在栈内存中,
引用类型的数据存放在堆内存中(但是,引用类型变量在栈内存中存放的是内存地址,这个内存地址指向的是这个堆内存的数据)
- 函数传参
值类型的变量传递的是在栈内存存放的值,函数内部操作的仅仅是一个值不会影响到值类型的变量
引用类型的变量传递的是内存地址,函数形参与引用类型的变量操作的是同一个数据(内存地址不变的情况下),所以会影响到这个引用类型的变量
// 2.1 值类型
function f(value) {
value++
return value
}
const value = 100
console.log('value: ' + value, ' f(value): ' + f(value))
// 2.2 引用类型
function f1(obj) {
obj.age = 10000
obj = {
uname: 'dj' // 重新赋值内存地址已经发生变化
}
return obj
}
const obj = {
age: 10
}
console.log('obj.age: ' + obj.age, 'f1(obj).name: ' + f1(obj).uname)
value: 100 f(value): 101
obj.age: 10 f1(obj).name: dj
- 比较
值类型的数据(变量)之间比较的是 值
引用类型的数据(变量)之间比较的是 内存地址
- 赋值
值类型的数据(变量)赋值的时候传递的是值 修改时不会影响原来的那个变量
引用类型的数据(变量)赋值的时候传递的是 内存地址 修改时会影响原来的那个变量
// 3 and 4 比较与赋值
let num = 10
let count = num
count++
console.log(num, count, 'num===count: ' + (num === count))
let obj = {
age: 100
}
let obj1 = obj
obj.age = 1000
obj1.name = 'dj'
console.log(obj, obj1, 'obj===obj1: ' + (obj === obj1))
10 11 num===count: false
{ age: 1000, name: 'dj' } { age: 1000, name: 'dj' } obj===obj1: true