回顾一下:?. (可选链操作符), || (逻辑或操作符 ),??(空值合并操作符),null,undefined

294 阅读3分钟

可选链式操作符?.

?. 可选链操作符用于访问可能为空或未定义的属性或方法,它允许我们安全地访问嵌套对象的属性.

如果中间的属性为空或未定义,则不会抛出错误,而是返回 undefined。

例如:

const obj = {
  foo: {
    bar: 123
  }
};
 
// 普通访问属性的方式
const x = obj.foo.bar; // x = 123
 
// 使用可选链操作符
const y = obj?.foo?.bar; // y = 123
 
// 如果对象未定义,则返回 undefined
const z = undefined?.foo?.bar; // z = undefined

空值合并操作符??

  1. 仅在左侧操作数为 nullundefined 时,才返回右侧操作数的值。
  2. 如果左侧操作数既不是 null 也不是 undefined(即使它的值为 false0""(空字符串)、NaN 或者 false),则返回左侧操作数的值。
const a = 0;
const b = 'default';
const result = a ?? b; // result 的值将是 0,因为 a 不是 null也不是undefined

逻辑或操作符 ||

当左侧操作数为假值时,返回右侧操作数的值。在JavaScript中,假值包括 false0-0NaN""(空字符串)、nullundefinedfalse

const a = 0;
const b = 'default';
const result = a || b; // result 的值将是 'default',因为 0 是 属于假值

?? 与 || 区别

  • 当左侧操作数是 0 时:
0 ?? 'some value';  // 0,因为 0 不是 null 也不是undefined
0 || 'some value';   // 'some value',因为 0 是假值
  • 当左侧操作数是 null 时:
null ?? 'some value';  // 'some value',因为 null符合取左值的要求
null || 'some value';   // 'some value',因为 null 是 假值
  • 当左侧操作数是 false 时:
false ?? 'some value';  // 'false''false' 不是 null 也不是undefined 取左值
false || 'some value';   // 'some value',因为 false 是 假值
  • 当左侧操作数是 ''(空字符串)时:
'' ?? 'some value';  // '',因为 ''不是 null 也不是undefined,取左值
'' || 'some value';   // 'some value',因为 '' 是 假值

小结

  1. 空值合并操作(??)符提供了一种更明确的、只针对 nullundefined 的条件选择方式
  2. 逻辑或操作符(||)则对所有假值都有效。使用 ?? 可以避免在 || 中可能出现的混淆,特别是当希望区分 0false 和空字符串等假值与 nullundefined 时。

null 与 undefined的区别

null

null 是一种基本数据类型,用于表示空值或者不存在的对象,即"no object"。我们可以将其视为一种特殊的占位符,表示一个变量或者对象不持有任何值,所以它通常用于初始化一个变量,以表明这个变量目前不指向任何特定的对象。

换句话说,当我们说一个变量是null ,我们是在明确地指出它目前没有被赋予任何对象的引用,它是一个尚未与任何对象建立联系的初始状态。

undefined

undefined 也是一种特殊的基本数据类型,用来表示一个变量已经创建,但是尚未被赋予具体的值,即"no value" 。 表示一个变量最原始的状态,相当于一个标记,用来指出变量存在但尚未定义其内容。

什么时候返回null?

访问 null 的属性:如果对象本身是 null,那么尝试访问其属性会返回 null

let nullObject = null;
console.log(nullObject.nonExistentProperty); // 输出: null

什么时候返回undefined?

de48741e66428a6c85562d8308bd261.png

这里我们只是定义了一个变量a,没有给它赋值,根据undefined表示no value,我们自然而然就能明白它就是undefined,它表达了这个a,将来可能是任意的值,但它现在的状态就是没有值的。

1.相同点

(1) 值相等

(2) 转布尔类型都是false

值相同

console.log( undefined == null )//true

转换Boolean的都是false

console.log( Boolean(undefined) )//false
console.log( Boolean(null) )//false

2.不同点

(1) 数据类型不同

(2) 转number类型的值不同

数据类型不同

console.log( undefined === null )//false

转换为Number类型的值不同

console.log( Number(undefined) )//NaN
console.log( Number(null) )//0

总结,用更加通俗的话来解释undefinednull

undefined相当于期房。 买了房,但买的是期房,房子还没建出来。(未定义)

null相当于毛坯房。买了房,但是房子没住人,里面是空的。(空值)