值类型 vs 引用类型
区别
1. 可变性
值类型的数据是不可变(immutable)的。指值本身,一旦创建,便不可更改。
值类型是存储在堆内存中。
let a = 1, b = 2;
a = 11;
常见类型: number
, string
, null
, undefined
, boolean
, symbol
引用类型值是可以改变的。
引用类型的值是将变量名称和引用地址存储 保存在堆内存 (Heap)
中的对象 (Object)
。
let a = { name: 'Rainy' };
let b = a;
b.github = 'Rain120'
let c = { job: 'front-end' };
常见类型: 对象object
, 函数 function
, 数组array
, 类型的包装函数Object
Array
Number
String
Boolean
, Math
Date
RegExp
库函数等
Note: JavaScript
不能直接操作对象的内存空间 (堆内存)。
2. 复制
值类型复制是值本身复制
let a = 1;
let b = a;
引用类型复制是值的引用复制
let a = { name: 'Rainy' }
let b = a;
b.github = 'Rain120'
Note:
- 函数传递的参数是引用类型时,函数的参数是传入的参数的引用,所以函数内部操作参数会对传入的参数造成副作用
==
和===
对引用类型的值判断结果是一样的,不准确。
对象引用
对象引用就是将一个引用类型的值复制给 另一个变量,实际上就是将 引用类型的堆地址 复制给新变量。
详细见上图