JavaScript数据类型分原始类型和引用类型:原始类型共7种(string、number、boolean、null、undefined、symbol、bigint),按值传递;引用类型如Object、Array等,变量存储内存地址,按引用传递。

JavaScript 数据类型分两类:原始类型(primitive)和引用类型(object)。区别不在“是不是对象”,而在值的存储方式和赋值/比较行为——原始类型按值传递,引用类型按内存地址传递。
原始类型有哪些?注意 null 和 undefined 的特殊性
共 7 种原始类型:string、number、boolean、null、undefined、symbol、bigint。
-
typeof null返回"object",这是历史遗留 bug,但null本质是原始类型 -
undefined是未赋值或未声明变量的默认值;null是开发者显式赋的“空值” -
Symbol()每次调用都生成唯一值,常用于对象属性名防冲突 -
BigInt用后缀n表示,如123n,不能和number混算(123n + 1报错)
引用类型有哪些?Array、Function、Date 都是 Object 的实例
所有非原始类型的值都是引用类型,底层都继承自 Object。常见包括:
-
Object、Array、Function -
Date、RegExp、Error -
Map、Set、WeakMap、WeakSet -
Promise、Proxy、Reflect
它们共性是:变量存储的是指向堆内存中实际数据的引用(指针),不是数据本身。
立即学习“Java免费学习笔记(深入)”;
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
赋值和比较时行为差异最直观:看 === 和修改影响
原始类型比较值,引用类型比较地址——哪怕内容一模一样,两个 {} 也不相等。
let a = 42;
let b = a;
b = 99;
console.log(a); // 42 —— 原始类型赋值是拷贝值
let x = { name: "Alice" };
let y = x; // y 和 x 指向同一块内存
y.name = "Bob";
console.log(x.name); // "Bob" —— 修改 y 影响了 x
console.log({} === {}); // false
console.log([] === []); // false
console.log(/a/ === /a/); // false
- 想深拷贝对象,不能只用
JSON.parse(JSON.stringify(obj)),它会丢掉function、undefined、Symbol、循环引用 -
Object.is(a, b)比===更严格,能区分+0和-0,且Object.is(NaN, NaN)返回true
检测类型别只信 typeof:用 instanceof 或 Object.prototype.toString.call()
typeof 对大部分引用类型都返回 "object",无法区分 Array、Date、null 等。
console.log(typeof []); // "object" console.log(typeof null); // "object" console.log(typeof new Date()); // "object" // 更可靠的方式: console.log(Object.prototype.toString.call([])); // "[object Array]" console.log(Object.prototype.toString.call(null)); // "[object Null]" console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]" // 或用 instanceof(注意跨 iframe 会失效) [] instanceof Array; // true
-
Array.isArray()是检测数组的推荐方式,比instanceof更健壮 -
typeof只对函数准确返回"function",其他引用类型都不可靠
原始 vs 引用的核心不是“能不能改变”,而是“变量里存的是什么”。一个 const obj = {} 不可重新赋值,但 obj.prop = 1 完全合法——因为 const 锁的是绑定,不是对象内容。这点最容易被忽略。










