js有7种基本类型+1种引用类型:基本类型(string、number、boolean、undefined、null、symbol、bigint)值存栈中,赋值拷贝值;引用类型(object及array、function等子类)地址存栈、数据存堆,赋值拷贝地址,故{}==={}为false、修改共享对象。

直接说“JS有7种基本类型+1种引用类型”,比罗列一堆名词更抓重点。面试官想听的不是背诵,而是你是否理解分类背后的存储逻辑和行为差异。
按内存存储方式分两类:栈值 vs 堆指针
基本类型(string、number、boolean、undefined、null、symbol、bigint)的值直接存在栈里,赋值是拷贝一份实实在在的数据;引用类型(object及其子类如array、function、date等)在栈里只存一个指向堆中真实数据的地址,赋值只是复制这个地址。
- 所以
{}==={}是 false——两个对象虽然长得一样,但堆里是两块不同内存,地址不同 -
let a = [1]; let b = a; b.push(2); console.log(a)输出[1, 2]——因为 a 和 b 指向同一块堆内存
按 typeof 行为分三档:能准判、常误判、全失效
typeof 对 function 返回 "function",对其他基本类型也基本准确;但它对 null 返回 "object"(历史 bug,不修);对所有引用类型(Array、Date、RegExp 等)一律返回 "object",完全无法区分。
- 判断数组别用
typeof arr === 'object',改用Array.isArray(arr)或Object.prototype.toString.call(arr) === '[object Array]' - 判断 null 要单独写
value === null,不能依赖 typeof
按相等比较逻辑分:值比较 vs 引用比较
基本类型用 === 比较的是值本身;引用类型用 === 比较的是内存地址是否一致。
-
0 == '0'是 true,因为 == 触发隐式转换,字符串被转成数字再比 -
0 === '0'是 false,因为类型不同,不转换直接判负 - 想深比较两个对象,得手写递归或用 JSON.stringify(注意函数、undefined、循环引用会丢)
按类型判断目的分:运行时安全 vs 开发期提示
实际开发中,类型判断不是为了“知道它是什么”,而是为了“防止它出错”。比如后端返回的 id 字段,你以为是 number,结果是 string,用 === 判断就永远不成立。
- 接口响应字段建议统一做类型校验(如用 Joi、zod),而不是靠 if-else 硬扛
- 工具函数里对参数做防御性判断:
if (typeof cb !== 'function') throw new Error('callback must be a function') - TypeScript 不是银弹,但能在编译期挡住大量类型误用,尤其适合团队协作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











