可选链式操作符?.
?. 可选链操作符用于访问可能为空或未定义的属性或方法,它允许我们安全地访问嵌套对象的属性.
如果中间的属性为空或未定义,则不会抛出错误,而是返回 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
空值合并操作符??
- 仅在左侧操作数为
null
或undefined
时,才返回右侧操作数的值。 - 如果左侧操作数既不是
null
也不是undefined
(即使它的值为false
、0
、""
(空字符串)、NaN
或者false
),则返回左侧操作数的值。
const a = 0;
const b = 'default';
const result = a ?? b; // result 的值将是 0,因为 a 不是 null也不是undefined
逻辑或操作符 ||
当左侧操作数为假值时,返回右侧操作数的值。在JavaScript中,假值包括 false
、0
、-0
、NaN
、""
(空字符串)、null
、undefined
和 false
。
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',因为 '' 是 假值
小结
:
- 空值合并操作
(??)
符提供了一种更明确的、只针对null
和undefined
的条件选择方式 - 逻辑或操作符
(||)
则对所有假值都有效。使用??
可以避免在||
中可能出现的混淆,特别是当希望区分0
、false
和空字符串等假值与null
或undefined
时。
null 与 undefined的区别
null
null
是一种基本数据类型,用于表示空值或者不存在的对象,即"no object"
。我们可以将其视为一种特殊的占位符,表示一个变量或者对象不持有任何值,所以它通常用于初始化一个变量,以表明这个变量目前不指向任何特定的对象。
换句话说,当我们说一个变量是null
,我们是在明确地指出它目前没有被赋予任何对象的引用,它是一个尚未与任何对象建立联系的初始状态。
undefined
undefined
也是一种特殊的基本数据类型,用来表示一个变量已经创建,但是尚未被赋予具体的值,即"no value"
。 表示一个变量最原始的状态,相当于一个标记,用来指出变量存在但尚未定义其内容。
什么时候返回null?
访问 null
的属性:如果对象本身是 null
,那么尝试访问其属性会返回 null
。
let nullObject = null;
console.log(nullObject.nonExistentProperty); // 输出: null
什么时候返回undefined?
这里我们只是定义了一个变量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
总结,用更加通俗的话来解释undefined
和null
undefined相当于期房。 买了房,但买的是期房,房子还没建出来。(未定义)
null相当于毛坯房。买了房,但是房子没住人,里面是空的。(空值)