原始类型存值,引用类型存地址;原始类型赋值/传参为值拷贝,互不影响;引用类型赋值/传参为地址拷贝,共享同一堆内存;typeof null 返回"object"是历史遗留bug。

核心区别在于内存存储方式和赋值/传递行为:原始类型存的是“值本身”,引用类型存的是“指向值的地址”。
原始数据类型直接存值
包括 number、string、boolean、null、undefined、symbol、bigint。它们在栈(stack)内存中占据固定大小空间,变量里直接保存实际数据。
- 赋值时是“拷贝一份新值”,两个变量完全独立
- 比如 let a = 10; let b = a; → 修改 b 不会影响 a
- 函数传参也是值拷贝,内部修改形参不影响外部实参
引用数据类型存的是地址
包括 object、array、function、date、regexp、map、set 等。真实数据存在堆(heap)内存,变量里只存一个指向该堆内存的引用(指针)。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 赋值时拷贝的是这个“地址”,不是数据本身
- 比如 let obj1 = {x: 1}; let obj2 = obj1; → obj1 和 obj2 指向同一块堆内存
- 修改 obj2.x = 2,obj1.x 也会变成 2
为什么 typeof 对 null 返回 "object"
这是 JS 历史遗留 bug。底层实现中,null 的二进制全为 0,而早期 JavaScript 引擎用低位标记数据类型,对象类型标识恰好是 0,于是把 null 误判为 object。ECMAScript 规范已明确这是错误但为兼容性保留至今。
判断类型更可靠的方式
typeof 对引用类型大多返回 "object"(除 function),不够精细:
- 用 Object.prototype.toString.call(x) → 返回 "[object Array]" 这类精确标签
- 对数组优先用 Array.isArray();对 null 可直接用 x === null
- ES6 新增 instanceof 和 constructor(注意后者可被改写,不绝对可靠)

















