控制台里打印一个对象属性,结果是 undefined,页面没报错,数据就是不显示。它不是错误,本身就是一个值,只是多数时候意味着哪里没接上。

它是 JavaScript 的基本类型之一,typeof 一个没赋值的变量,返回字符串 undefined。变量声明了没赋值、函数没有 return、对象上不存在的属性、调用函数时少传参数,读出来都是它,连数组里没填值的空位也一样。空字符串、0、false 和它不是一回事,做判断时别混着写。

最常见的四个来源

  • let a 声明后没赋值,a 的值就是它。
  • 函数体里只写 console.log,没有 return,调用结果就是它。
  • obj.name 属性不存在,不报错,返回它。
  • 函数定义三个参数,调用只传两个,第三个就是它。

它和 null 不是一回事

null 是主动赋的空值,表示这里故意留空;它则是系统给的缺省值,表示还没赋值。JSON.stringify 会把值是它的键直接丢掉,null 会保留成 null。接口返回里两个都可能出现,前端判断时要分开处理,别用 if 一把梭,更别直接和空字符串比。

判断时注意变量有没有声明

已知变量用 x === undefined 判断最直接。变量可能根本没声明,直接写会抛 ReferenceError,这时用 typeof x === 'undefined' 更安全。函数的默认参数只在实参为它时生效,传 null 不会触发,这个细节写工具函数时很容易踩。

别主动给变量赋空值

有人习惯把变量显式赋成它,其实就是 let a,多写反而绕。真想让字段表示空,用 null 更明确;想删掉对象上的键,用 delete。老代码里用 void 0 代替它,主要是历史习惯,现在没必要这么写。

实际写代码时,与其到处判断,不如在数据入口做校验,该给默认值就给。它出现本身不可怕,怕的是一路传到渲染层才炸出来,报错信息还指不到源头。控制台里看到它,先从数据来源往上追,比在渲染函数里打补丁靠谱,断点打在赋值那一行最省时间,看调用栈比猜快。