javascript 的 null 是原始类型,表示有意缺失的值,与 undefined 语义不同;数据库 null 映射为 js null 是主流做法,但需注意序列化差异、orm 配置及前后端空值约定。

JavaScript 中的 null 是一个原始值,表示“有意缺失的值”,而数据库中的空值(如 SQL 的 NULL)语义上也代表“未知”或“未设置”。但二者在类型系统、序列化行为和实际映射时存在关键差异,需谨慎处理。
Null 类型在 JS 中的本质
null 是 JavaScript 七个原始类型之一(尽管 typeof null === 'object' 是历史遗留 bug)。它与 undefined 不同:null 是开发者主动赋的“空”,undefined 多表示未初始化或属性不存在。在 JSON 序列化中,null 会被保留;undefined 则被忽略或转为 null(如对象字段值为 undefined,JSON.stringify 后该字段消失)。
数据库 NULL 字段的常见映射行为
多数 ORM 或数据库驱动(如 PostgreSQL 的 pg、MySQL 的 mysql2)会将数据库 NULL 映射为 JavaScript 的 null,这是合理且主流的做法。但要注意:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 某些驱动对空字符串
''、数字0、布尔false等“falsy 值”不做特殊处理,它们不会被误转为null - 若数据库字段定义为
NOT NULL,则不会返回NULL,对应 JS 中也不会出现null,应依赖 schema 保证数据完整性 - 部分旧版驱动或自定义查询可能将
NULL转成undefined,需统一转换逻辑(例如在结果处理器中row.field == null ? null : row.field)
前后端交互时的典型陷阱
通过 API 传输数据时,null 和 undefined 在 JSON 中表现不同,但接收方容易混淆:
- 前端发送
{ name: null }→ 后端收到req.body.name === null,可安全映射到数据库NULL - 前端发送
{ name: undefined }→ JSON.stringify 后该字段被删,后端收到的是不含name的对象,需判断是“未传”还是“显式清空” - 建议后端统一约定:显式设为
null表示置空,字段缺失表示不更新;前端提交前用Object.keys(data).map(k => ({ [k]: data[k] ?? null }))确保空值可控
ORM 层的 null 处理建议
使用 TypeORM、Prisma 或 Sequelize 时,应明确字段是否允许为空:
- TypeORM 中
@Column({ nullable: true })对应数据库NULL,JS 层属性可为null;反之若设为nullable: false,运行时仍可能因数据异常出现null,需配合校验中间件拦截 - Prisma 默认将数据库
NULL映射为null,且生成的 Client 类型中字段带| null联合类型(如email: String | null),强制开发者处理空值 - 避免在 JS 里用
==判断null(会与undefined混淆),一律用=== null或Object.is(value, null)
映射本身不复杂,但关键在于统一语义、明确边界,并在序列化/反序列化环节保持一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










