本文内容经作者@Dmitri Pavluti正式授权进行翻译与传播
JavaScript语言中存在两种主要的数据类型:基本数据类型(涵盖string、booleans、number以及symbol等)以及更为复杂的对象类型。
在JavaScript中,对象是一种结构化的数据形式,其中最基础的类型即为普通对象,它本质上是由一系列键值对构成的集合:
然而在某些特定场景下,我们可能无法成功创建对象。为了应对这种情况,JavaScript语言引入了一个特殊的值——null,这个值专门用于表示对象缺失或不存在的情况。
本文将全面探讨JavaScript中null的相关知识,包括其定义含义、检测方法、与undefined的区别,以及使用null可能导致的代码维护难题。
1. null的核心概念解析
根据JavaScript官方规范对null值的定义:
值 null特指当前对象不存在或未被赋值的状态,它属于JavaScript的基本数据类型之一,在布尔运算中会被视为falsy值。
例如,我们定义了一个函数greetObject(),该函数用于创建对象,但在无法成功创建对象时也可以返回null:
当以无参数形式调用greetObject()函数时,该函数会返回null。这种返回null的操作是合理的,因为函数参数who没有提供有效的值。
2. null值的检测方法
检测null值最可靠的方式是使用严格相等运算符:
missingObject === null的结果为true,这是因为missingObject变量中存储的就是null值。
如果变量中包含非空值(例如某个对象实例),则表达式existObject === null的计算结果将为false。
2.1 null作为虚值的应用场景
null与false、0、”、undefined、NaN都属于虚值范畴。当在条件语句中遇到这些虚值时,JavaScript引擎会自动将它们转换为false进行处理。
2.2 typeof运算符与null的特殊关系
typeof运算符用于确定变量的数据类型。例如,typeof 15会返回’number’,typeof {prop:’Value’}的计算结果是’object’。
值得注意的是,typeof null的结果是什么
为什么会出现这种‘object’的结果,这实际上是早期JavaScript实现中的一个历史遗留问题。
在实际开发中,要检测null值,建议使用严格等于运算符myVar === null。
如果我们需要使用typeof运算符来检查变量是否为对象类型,还需要特别处理null值的情况:
3. null值引发的常见问题
null值经常在不经意间出现在我们预期应为对象类型的变量中。一旦尝试从null值中访问属性,JavaScript会立即抛出TypeError异常。
再次以greetObject()函数为例,并尝试从返回的对象中访问message属性:
由于who变量是一个空字符串,所以该函数返回null。当尝试从null值中访问message属性时,将触发TypeError错误。
为了有效处理null值,可以使用带有空值合并运算符的可选链操作符:
4. 探索null值的替代方案
当无法成功创建对象时,我们通常的做法是返回null,但这种做法存在明显缺陷。在代码执行过程中,任何出现null值的位置都需要额外的检查逻辑。
建议尽量避免使用返回null的做法:
- 优先返回默认对象而非null
- 在无法处理的情况下抛出错误而非返回null
回到最初示例中的greetObject()函数。当缺少参数时,可以选择返回一个默认对象,而不是返回null:
或者选择抛出错误处理异常情况:
这两种方法都能有效避免使用null值带来的问题。
5. null与undefined的关键区别
undefined代表未初始化的变量或对象属性的默认值。与null相比,undefined表示变量尚未被赋值的状态。
null和undefined之间的核心区别在于:null表示对象缺失,而undefined表示未初始化的状态。
严格的相等运算符===能够准确区分null和undefined:
而双等运算符==则将null和undefined视为相等
我通常使用双等相等运算符来检查变量是否为null 或undefined:
6. 完整总结
null是JavaScript语言中的一个特殊值,专门用于表示对象缺失的状态,使用严格相等运算符(variable === null)可以准确检测null值。
typeof运算符对于确定变量类型(如number、string、boolean)非常有用。但需要注意,对于null值,typeof会产生误导性结果:typeof null始终返回’object’。
null和undefined在某些场景下可以视为等价,但null表示对象缺失,而undefined代表未初始化状态。
作者:Dmitri Pavluti 译者:前端小智 来源:dmitripavlutin
原文链接:https://dmitripavlutin.com/javascript-null/#comments
特别推荐一套 《商业级应用-微信小程序开发实战》,这是一套纯粹基于实战经验编写的技术资料,完全基于真实项目开发,通过极致的产品体验和完美的细节处理,带你掌握”真实场景”下的小程序开发。对小程序开发感兴趣的朋友可以联系我获取免费资料。获取方式:关注本账号+转发本文+点赞,然后私信回复 “小程序” 即可获得完整资料包。