JavaScript 双问号(空值合并运算符)


prtyaa
prtyaa 2023-12-26 17:53:52 69040
分类专栏: 资讯
  • 你在网上浏览 JavaScript 代码时,可能会发现有的表达式用了两个问号(??)如下所示:

    alert(username ?? "Guest");
    

    这里的双引号称为空值合并运算符,它是 ES2020 的一个新特性,它的作用是当一个表达式是 null 或者 undefined 时为变量设置一个默认值。

    空值合并运算符在左侧的值是 null 或 undefined 时会返回问号右边的表达式。

    例如,如下代码会把 firstName 变量值赋值给 username 变量。当 firstName 是 null 时,则把 "Guest" 赋值给 username。

    let firstName = null;
    let username = firstName ?? "Guest";
    console.log(username); // "Guest"
    

    或者也可以这样写:

    let username = undefined ?? "Guest";
    console.log(username); // "Guest"
    

    不同于 JavaScript 逻辑或(||),空值合并运算符不会在左侧操作数为假值时返回右侧操作数。其中一个例子是左侧的表达式是空字符串("")。

    JavaScript 会认为空字符串为假值,如下:

    let firstName = ""; // empty string evaluates to false in JavaScript
    let username = firstName ?? "Guest";
    console.log(username); // ""
    

    之所以引入空值合并运算符,是因为有时候我们想把假值如 0 和空字符串 "" 视为有效的数值。而逻辑或操作符不会返回假值。

    用了空值合并运算符,可以做到只把 null 和 undefined 替换为一个预定义的值。

    配合 || 和 && 运算符使用 ??

    出于安全考虑,双问号配合 JavaScript 逻辑或(||)和逻辑与(&&)时如果没有用括号引起来是不允许的。

    例如,如下代码会在把 "Guest" 用作 username 的默认值之前,首先检查 firstName 或 lastName 变量值能否作为它的值。

    let firstName = "John";
    let lastName = "Stone";
    let username = firstName || lastName ?? "Guest"; // Error: Unexpected token '??'
    
    console.log(username);
    

    这是因为 JavaScript 无法决定首先执行哪个操作符。你需要使用括号来明确告知表达式的优先级。

    如下代码会首先执行括号内的表达式:

    let firstName = null;
    let lastName = undefined;
    let username = (firstName || lastName) ?? "Guest"; // Error: Unexpected token '??'
    
    console.log(username); // "Guest"
    

    结语

    JavaScript 双问号也称为空值合并运算符。这个运算符只会在左侧表达式是 null 或 undefined 时返回右侧的表达式。

    不同于逻辑或,空值合并运算符会允许把 0 和空字符串作为有效的数值。

    不要忘记在配合逻辑或/与使用时用上括号。

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=30946
赞同 0
评论 0 条