JavaScript中关于null的一切
本文已经作者@Dmitri Pavluti授权翻译
JavaScript有2种类型:基本类型(string, booleans number,symbol)和对象 。
对象是复杂的数据结构 , JS 中最简单的对象是普通对象:一组键和关联值:
let myObject = {name: '前端小智'}
但是在某些情况下无法创建对象 。在这种情况下 , JS 提供一个特殊值null —表示缺少对象 。
let myObject = null
在本文中 , 我们将了解到有关JavaScript中null的所有知识:它的含义 , 如何检测它 , null与undefined之间的区别以及为什么使用null造成代码维护困难 。
1. null的概念JS 规范说明了有关null的信息:
值 null 特指对象的值未设置 , 它是 JS 基本类型 之一 , 在布尔运算中被认为是falsy 。
例如 , 函数greetObject()创建对象 , 但是在无法创建对象时也可以返回null:
function greetObject(who) {if (!who) {return null;}return { message: `Hello, ${who}!` };}greetObject('Eric'); // => { message: 'Hello, Eric!' }greetObject();// => null
但是 , 在不带参数的情况下调用函数greetObject()时 , 该函数返回null 。返回null是合理的 , 因为who参数没有值 。
2. 如何检查null检查null值的好方法是使用严格相等运算符:
const missingObject = null;const existingObject = { message: 'Hello!' };missingObject=== null; // => trueexistingObject === null; // => false
missingObject === null的结果为true , 因为missingObject变量包含一个null 值 。
如果变量包含非空值(例如对象) , 则表达式existObject === null的计算结果为false 。
2.1 null 是虚值null与false、0、''、undefined、NaN都是虚值 。 如果在条件语句中遇到虚值 , 那么 JS 将把虚值强制为false 。
Boolean(null); // => falseif (null) {console.log('null is truthy')} else {console.log('null is falsy')}
2.2 typeof nulltypeof value运算符确定值的类型 。例如 , typeof 15是'number' , typeof {prop:'Value'}的计算结果是'object' 。
有趣的是 , type null的结果是什么
typeof null; // => 'object'
为什么是'object' , typoef null为object是早期 JS 实现中的一个错误 。
要使用typeof运算符检测null值 。如前所述 , 使用严格等于运算符myVar === null 。
如果我们想使用typeof运算符检查变量是否是对象 , 还需要排除null值:
function isObject(object) {return typeof object === 'object' }isObject({ prop: 'Value' }); // => trueisObject(15);// => falseisObject(null);// => false
3. null 的陷阱null经常会在我们认为该变量是对象的情况下意外出现 。 然后 , 如果从null中提取属性 , JS 会抛出一个错误 。
再次使用greetObject()函数 , 并尝试从返回的对象访问message属性:
let who = '';greetObject(who).message; // throws "TypeError: greetObject() is null"
因为who变量是一个空字符串 , 所以该函数返回null 。从null访问message属性时 , 将引发TypeError错误 。
可以通过使用带有空值合并的可选链接来处理null:
let who = ''greetObject(who)?.message ?? 'Hello, Stranger!'// => 'Hello, Stranger!'
4. null 的替代方法当无法构造对象时 , 我们通常的做法是返回null , 但是这种做法有缺点 。 在执行堆栈中出现null时 , 刚必须进行检查 。
尝试避免返回 null 的做法: