JavaScript 中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像 SQL 一样申明某个键值为 int 就只能保存整型数值,申明 varchar 只能保存字符串。
一个变量所保存值的类型也可以改变,这在 JavaScript 中是完全有效的,只是不推荐。相比较于将变量理解为"盒子",《JavaScript 编程精解》中提到应该将变量理解为"触手",它不保存值,而是抓取值。这一点在当变量保存引用类型值时更加明显。
JavaScript 中变量可能包含两种不同的数据类型的值:基本类型和引用类型。基本类型是指简单的数据段,而引用类型指那些可能包含多个值的对象。
补充
补充:JavaScript 的"松散类型"(loose typing / weakly typed),本质上是因为变量本身没有类型(变量只是值的"触手"),值才有类型。
- 基本类型(值类型,栈中存储) :
string、number、boolean、null、undefined、symbol、bigint。访问/赋值是值拷贝。- 引用类型(堆中存储) :
object(含 Array、Function、Date、RegExp 等)。变量保存的是引用,多个变量指向同一对象时改一处会互相影响。- 类型判断 :
typeof(无法区分 null、数组、对象)、instanceof(原型链判断)、Array.isArray(数组专用)、Object.prototype.toString.call(x)(最通用)。优缺点:松散类型让 JS 灵活易上手,但也带来隐式转换、运行时类型错误等问题;TypeScript / Flow 即是为该痛点而生。
let x = 42 // number
x = 'hello' // 合法:类型可变
x = { a: 1 } // 合法:可以是引用类型
const a = { n: 1 }
const b = a
b.n = 99
console.log(a.n) // 99(共享同一引用)
来源整理自:vue3js.cn 面试官系列



