JavaScript有7种原始类型(null、undefined、boolean、number、string、symbol、bigint)和1种引用类型(object),关键在区分值/引用比较、可变性及typeof陷阱;函数是object子类,typeof返回"function"属历史兼容设计。

JavaScript 中只有 7 种原始(primitive)类型和 1 种引用(object)类型,但实际使用中「对象」又细分为多种内置构造器实例,理解它们的关键不在于死记数量,而在于区分「值比较 vs 引用比较」「可变性」「typeof 返回值陷阱」。
7 个原始类型:null、undefined、boolean、number、string、symbol、bigint
它们都满足:按值传递、不可变、typeof 可靠(除 null 外)。
常见误区:
-
typeof null返回"object"—— 这是历史 bug,一直没改,判断 null 要用value === null -
typeof NaN是"number",NaN 不等于自身,要用Number.isNaN()判断 -
symbol每次调用Symbol()都产生唯一值,即使描述相同;Symbol.for("a")才会复用全局注册的 symbol -
bigint字面量必须加n后缀(如123n),不能和 number 混合运算,否则报TypeError
Object 类型:包括普通对象、数组、函数、日期、正则等内置构造器实例
它们共性是:按引用传递、可变、typeof 统一返回 "object"(函数除外,typeof function(){} === "function")。
立即学习“Java免费学习笔记(深入)”;
识别具体类型得靠:
-
Array.isArray(arr)—— 不要用typeof arr === "object"或arr instanceof Array(跨 iframe 失效) -
Object.prototype.toString.call(value)返回"[object Array]"等字符串,最可靠 -
value instanceof Date可用于同域 Date 判断,但对 JSON 序列化后的日期字符串无效 -
value.constructor === RegExp不稳定,构造器可能被改写,优先用value instanceof RegExp或Object.prototype.toString
为什么 typeof function 返回 "function" 却不算独立类型?
规范里明确说 function 是 object 的一种,只是引擎对函数对象做了特殊处理,让 typeof 返回 "function"。它依然有原型、可扩展属性、能被 instanceof Object 判定为真。
这意味着:
- 你可以给函数添加属性:
fn.count = 0 -
fn instanceof Object是true - 但
typeof /abc/是"object",typeof new Date()也是"object",唯独函数被typeof单独标出 —— 纯属历史兼容设计
真正容易被忽略的是:原始类型在装箱(boxing)时会临时转成对应包装对象(如 new String("a")),但日常几乎用不到;而 new Number(42) === 42 是 false,因为一个是对象,一个是原始值 —— 这类隐式转换坑比类型本身还多。











