JavaScript开发人员都有这样的经历——在使用变量之前,必须检查它是否为null或undefined。这导致了很多重复的条件检查,可能会使我们的代码混乱不堪。
随着在ECMAScript 2020中引入了nullish coalescing操作符,我们现在有了一种更清晰的处理null或undefined值的方式。
在这篇文章中,我将解释nullish coalescing操作符是什么,演示如何使用它,并讨论为什么它是JavaScript语言中如此重要的一部分。
什么是Nullish Coalescing操作符?
Nullish Coalescing操作符(??)是在ECMAScript 2020中引入的逻辑运算符,用于处理null或undefined的默认值。
它返回第一个操作数,如果它不是null或undefined。否则,它返回第二个操作数。
基本语法如下:
代码语言:javascript复制let name = value ?? 'Default';如果value是null或undefined,它将返回'Default'。如果value有任何其他值,比如''、0、false等,它将返回该值而不做改变。
这使我们能够更简洁地分配默认值,而不需要多个条件检查。
使用Nullish Coalescing操作符
以下是如何使用nullish coalescing操作符的一些常见示例:
示例1:基本用法
代码语言:javascript复制let undefinedValue;
let defaultValue = 'default';
let result = undefinedValue ?? defaultValue;
console.log(result); // 输出:'default'在这个例子中,undefinedValue是undefined,因此Nullish Coalescing操作符返回defaultValue。
示例2:带有null值
代码语言:javascript复制let nullValue = null;
let defaultValue = 'default';
let result = nullValue ?? defaultValue;
console.log(result); // 输出:'default'在这种情况下,nullValue是null,因此操作符再次返回defaultValue。
示例3:带有非nullish值
代码语言:javascript复制let nonNullishValue = 'I am defined';
let defaultValue = 'default';
let result = nonNullishValue ?? defaultValue;
console.log(result); // 输出:'I am defined'在这种情况下,nonNullishValue既不是null也不是undefined,因此操作符返回nonNullishValue。
示例4:带有零和空字符串
代码语言:javascript复制let zeroValue = 0;
let defaultValue = 'default';
let result = zeroValue ?? defaultValue;
console.log(result); // 输出:0
let emptyStringValue = '';
result = emptyStringValue ?? defaultValue;
console.log(result); // 输出:''在这些情况下,该操作符分别返回0和'',因为它只检查null或undefined,而不是其他“falsy”值,比如0或''。
示例5:对象属性赋值
代码语言:javascript复制let user = {
firstName: null,
lastName: 'Doe'
};
let firstName = user.firstName ?? 'John';
let lastName = user.lastName ?? 'Doe';
console.log(firstName); // 输出:'John'
console.log(lastName); // 输出:'Doe'在这种情况下,firstName属性为null,因此Nullish Coalescing操作符将其替换为'John'。lastName属性既不是null也不是undefined,因此它保持为'Doe'。
示例6:链接
Nullish Coalescing操作符可用于链接操作,检索列表中的第一个已定义值:
代码语言:javascript复制let value1 = null;
let value2 = undefined;
let value3 = 'Hello, World!';
let value4 = 'Another Value';
let result = value1 ?? value2 ?? value3 ?? value4; // 结果将是'Hello, World!'在这种情况下,value1和value2为null或undefined,因此它们被跳过。value3是第一个非nullish值,因此它被返回。
示例7:数组
代码语言:javascript复制let arr = [null, undefined, 'Hello, World!'];
let value = arr[0] ?? 'Default Value'; // value将是'Default Value'
value = arr[2] ?? 'Default Value'; // value将是'Hello, World!'在这种情况下,该操作符用于检查数组中特定索引是否为null或undefined,并在是的情况下提供默认值。
比较||和??
||(逻辑或)和??(Nullish Coalescing操作符)都用于为变量提供默认值。但是,它们的运作方式存在细微的差异,可能导致不同的结果。
逻辑或||
逻辑或||运算符返回第一个操作数,如果它是真值。否则,返回第二个操作数。然而,JavaScript认为以下值为假值:
false0''(空字符串)NaNnullundefined当使用||提供默认值时,这可能导致意外的结果。例如:
代码语言:javascript复制let count = 0;
let displayCount = count || 'Not specified';
console.log(displayCount); // 输出:'Not specified'在上面的代码中,0是count的有效值,但由于0为假值,||运算符返回第二个操作数'Not specified'。
Nullish Coalescing操作符??
Nullish Coalescing操作符??是一个逻辑运算符,如果第一个操作数不是null或undefined,它将返回第一个操作数,否则返回第二个操作数。
这使得??更适合提供默认值,因为它只在原始值为null或undefined时才回退到默认值,而不是在其他falsy值(如0、false或'')上回退。
使用之前的例子但使用??:
代码语言:javascript复制let count = 0;
let displayCount = count ?? 'Not specified';
console.log(displayCount); // 输出:0在这种情况下,0被正确显示,因为??运算符正确地识别出count不是null或undefined。
虽然||和??都可以用于提供默认值,但是??通常是一个更安
全的选择,因为它不将0、false和''(空字符串)视为回退条件。这使得??在这些falsy值是有效且预期的情况下特别有用。
为什么它对于编写干净的代码至关重要
Nullish Coalescing操作符对于编写清晰的JavaScript代码至关重要的原因有几点:
避免重复的条件语句——正如前面提到的,它消除了我们代码中多个if/else检查的需要。默认参数值——这使得在函数参数中清晰地定义默认值变得很容易。可选链——与可选链结合使用时效果很好,用于访问嵌套属性。可读性——使用??的代码相对于深奥的条件语句来说更容易理解。未来的证明——随着JavaScript的发展,类似于此类的更多功能将继续改进语言。早期采用新的语法使我们的代码更适应未来。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

