JavaScript简单与复杂数据类型区分:BigInt归类困惑
原始类型与非原始类型的准确区分标准
你混淆了「值的字面量长度/视觉复杂度」和「原始/非原始类型的本质区别」——类型的划分和值的长短无关,核心看内存存储、可变性和比较逻辑。以下是准确的区分标准:
1. 内存存储方式
- 原始类型:变量直接存储值本身,数据存在栈内存中。哪怕是像
var a = 2736473563479857345397538528937598327n(注意BigInt需要加n后缀)这样的超长数值,本质还是单个独立的值,符合原始类型的存储逻辑。 - 非原始类型(引用类型):变量存储的是内存地址,实际的复杂数据结构(比如对象、数组)存在堆内存中,变量通过地址指向这个结构。比如
let arr = [1,2,3],arr存的不是数组本身,而是堆里这个数组的地址。
2. 可变性
- 原始类型:不可变(immutable)。你无法直接修改原始值的内容,比如执行
let str = "test"; str.toUpperCase(),不会改变原str的值,而是返回一个新的字符串。 - 非原始类型:可变(mutable)。可以直接修改其内部的属性或元素,比如
let obj = {name: "Tom"}; obj.name = "Jerry",会直接改变原对象的内容。
3. 比较逻辑
- 原始类型:比较的是值本身。只要值相同,比较结果就是
true,比如5n === 5n、"abc" === "abc"都返回true。 - 非原始类型:比较的是内存地址。哪怕两个对象的内容完全一致,
{a:1} === {a:1}也会返回false,因为它们存在堆内存的不同地址上。
快速识别技巧
- 原始类型:
Number、String、Boolean、Null、Undefined、Symbol、BigInt——都是单个独立的值,没有内部嵌套的属性或结构。 - 非原始类型:
Object(包括数组Array、函数Function、正则RegExp等所有Object子类)——都包含多个属性/元素的集合,有内部结构。
内容的提问来源于stack exchange,提问作者Hassaan Javed
相关产品推荐
相关产品推荐

