一个经典的问题:以下两个输出结果为何不一致?
// 情况1:值类型
let a = 100
let b = a
b = 20
console.log(a) // 100
// 情况2:引用类型
let a = { age: 100 }
let b = a
b.age = 20
console.log(a.age) // 20
解答:
情况1中的b为值类型
,而情况2中的b为引用类型
。
值类型:
- 值类型的变量占用空间固定,保存在栈中。
- 值类型的变量b可以看作是和a不相关的变量。
- b的改变不会影响到a的值,保存与复制的是值本身。
- 使用typeof检测数据的类型
引用类型:
- 引用类型的变量占用空间不固定,保存在堆中。
- 引用类型的变量b同a指向同一个内存地址。
- b的改变会影响到a的值,保存与复制的是指向对象的一个指针。
- 使用instanceof检测数据类型
引申出的问题:js中哪些变量是值类型,哪些变量是引用类型?
常见的值类型:
let a // undefined,注意:未定义的变量不可用const定义
const s = 'abc' // 字符串
const n = 100 // 数字
const b = true // bool
const s = Symbol('s') // symbol
常见的引用类型:
const obj = { x: 100 } //对象
const arr = ['a', 'b', 'c'] //数组
const n = null // 特殊引用类型,指针指向空地址