JS中? ?和??=和?.和 ||的区别

2023-05-16

undefined和null是两个比较特殊的数据类型,是不能用点操作符去访问属性的,否则将会报错

    let a;
    console.log(a?.name); //undefined
    console.log(a.name); //报错

 

    let obj = {};
    console.log(obj.name); //undefined
    console.log(obj?.name?.a); //undefined
    console.log(obj.name.a); //报错

?? 与 || 的区别

相同点:
?? 和 || 的用法相同,都是前后是值,中间用符号连接,根据前面的值来判断最终是返回前面的值还是后面的值。
A ?? B
A || B

不同点:
判断的方法不同:
使用 ?? 时,只有A为 null 或者 undefined 时才会返回 B;
使用 || 时,A会先转化为布尔值判断,为true时返回A , false 返回B

// ??
    console.log(undefined ?? 2);  // 2
    console.log(null ?? 2);   // 2
    console.log(0 ?? 2);  // 0
    console.log("" ?? 2);   // ''
    console.log(true ?? 2);  // true
    console.log(false ?? 2);   // false

// ||
    console.log(undefined || 2);   // 2
    console.log(null || 2);     // 2
    console.log(0 || 2);        // 2
    console.log("" || 2);     // 2
    console.log(true || 2);     // true
    console.log(false || 2);      // 2

空值合并操作符 ??

只有当左侧为null 或者undefined 时,才会返回右侧的值

可选链操作符 ?. 

?. 允许读取连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。

?. 操作符的功能类似于. 链操作符,不同之处在于,在引用为空,即 null 或者 undefined 的情况下不会引起错误,该表达式短路返回值。 

    const obj = { a: { b: [{ name: "obj" }] } };

    // 原本的写法
    console.log(obj && obj.a && obj.a.b.length && obj.a.b[0].name); //obj

    // 可选链写法
    console.log(obj?.a?.b?.[0]?.name); // obj
    console.log(obj?.b?.c?.d); // undefined

?.可以和 ?? 运算符结合使用 

    const obj = { a: { name: "obj" } };

    console.log(obj?.a?.b ?? "hello world"); // hello world

空值赋值运算符(??=)

当??=左侧的值为null、undefined的时候,才会将右侧变量的值赋值给左侧变量.其他所有值都不会进行赋值 

    let a = "你好";

    let b = null;
    let c = undefined;
    let d = 0;
    let e = "";
    let f = true;
    let g = false;

    console.log((b ??= a)); // 你好
    console.log((c ??= a)); // 你好
    console.log((d ??= a)); // 0
    console.log((e ??= a)); // ''
    console.log((f ??= a)); // true
    console.log((g ??= a)); // false

    console.log(b); // 你好
    console.log(c); // 你好
    console.log(d); // 0
    console.log(e); // ''
    console.log(f); // true
    console.log(g); // false

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS中? ?和??=和?.和 ||的区别 的相关文章

  • ubuntu22.04系统配置(一)(后续有kali的配置)

    ubuntu22 04系统配置深度学习 xff08 一 xff09 xff08 后续有kali的配置 xff09 摘要系统下载以及U盘拷贝系统的基本配置nvidia smi 摘要 配置这个东西真的踩了好多坑 xff0c 之前一直用的Wind
  • GINet:Graph Interaction Network for Scene Parsing(ECCV 2020)详解

    论文地址 xff1a https arxiv org pdf 2009 06160 pdf 一 背景 Scene Parsing 任务属于语义分割的一个分支 xff0c 也是把每个像素点分成一个具体的语义类别 xff0c 它和常见的语义分割
  • C++ string切割,分解字符串,C 库函数 - strtok()

    声明 下面是 strtok 函数的声明 char strtok char str const char delim 参数 str 要被分解成一组小字符串的字符串 delim 包含分隔符的 C 字符串 返回值 该函数返回被分解的第一个子字符串
  • BGP详解

    BGP协议详解 BGP是一种边界网关协议 但是也属于动态路由协议 一 BGP的特征 xff08 一种外部路由协议 xff0c 用来在AS之间传递路由信息 xff0c 是一种增强版的距离矢量协议 xff09 1 可靠的路由更新机制 传输协议
  • el-input-number 如何实现默认不填充0

    只需要把数据设置未 undefined 的就可以了 lt el input number v model 61 num 64 change 61 handleChange min 61 1 max 61 10 label 61 描述文字 g
  • vue项目 el-input输入框字符限制,只显示英文及数字

    element的el input没有限制输入的内容 xff0c 想要限制输入内容就需要自己来开发 xff0c 我使用的方式是正则来判断进行再次赋值实现的 xff0c 不废话上代码 xff1b lt el input v model 61 3
  • cdn方式使用vue和element-ui进行前端开发

    安装 按照vue和element ui的官网开发指南中提供的cdn安装方式 xff0c 直接以script方式引入 要注意引入顺序 span class token comment lt 引入样式 gt span span class to
  • vue el-table 如何实现表格根据分页索引自增长

    在el table 里设置type 61 index xff0c 可以实现表格的索引自增长 xff0c 但是如果我们给表格增加了分页 xff0c 切换页面索引任然是从1 20 xff08 20是自己分页的数量 xff09 xff0c 那么想
  • Vue的计算属性和监听属性

    1 计算属性 computed 当依赖数据发生变化时 xff0c 计算属性会被重新计算 有且只有在依赖数据发生变化时它才会重新计算 xff0c 其他的数据变化对计算属性 应用场景 xff1a 数据的计算显示 v for用v if的计算 sp
  • Element UI el-form-item 遍历表单校验规则

    一 遍历表单校验规则实现案例 prop内容为 遍历数据 43 index 43 校验数据 span class token operator lt span div span class token keyword class span s
  • uni-app引入uView2.0的步骤

    引入uVIew组件可以使用uni app市场插件安装插件即可 xff0c 也可以使用npm下载安装 xff0c 不过使用npm需要在pages json使用easycom属性引用需要的组件类 在uni app插件市场右上角选择使用HBuil
  • Vue-cli创建项目步骤

    一 使用 vue cli 搭建项目 下面整个过程是基于已经安装node js和cnpm的基础上 xff0c node js如何安装就不在这里详说了 xff08 1 xff09 全局安装 vue cli xff0c 在命令提示窗口执行 xff
  • keil5建立工程

    1 xff0c 确认工程代码 主要包括代码的目录或者代码的svn路径 xff0c 其次再来确认代码的编译方法 xff0c 确认该代码是需要keil5编译还是linux gcc 43 makefile 编译 2 xff0c 确认编译手段 确认
  • win10下 frpc的开机自启动

    frp可以用来进行内网穿透 xff0c 其具体实现原理可以参考网上其他教程 xff0c 本文主要描述用户端程序frpc exe在win10下的一种开机自启动方法 本地组策略 在完成配置最后 xff0c 需要进行自启动配置 xff0c 一般的
  • qt 设置背景图片、背景色步骤

    拖一个label 控件 label 上右键选择改变样式表 xff0c 添加资源选择图片 一 设置背景图 background image xff1a 二 铺满整个label border image xff1a 三 添加图片 xff0c i
  • QT 设置按钮QPushButton 圆角、渐变色背景、背景图片、鼠标放上去、鼠标按下效果、透明背景

    设置按钮圆角 渐变色背景 背景图片 鼠标放上去 鼠标按下效果 透明背景 效果 xff1a 一 设置四角圆角 xff1a 二 设置下 左圆角 按钮鼠标放上去改变背景色 三 设置上 右圆角 四 按钮设置背景图片 xff0c 鼠标放上去 按下 更
  • processlist中状态详解

    在processlist中 xff0c 看到哪些运行状态时要引起关注 xff0c 主要有下面几个 xff1a 状态建议copy to tmp table执行ALTER TABLE修改表结构时建议 xff1a 放在凌晨执行或者采用类似pt o
  • 在oVirt上安装Win11虚拟机

    在oVirt上安装Win11虚拟机
  • 【Debugging】树莓派 SSH连接失败解决

    问题描述 在使用SSH连接时出现如下错误 xff1a Remote side unexpectedly closed network connection 解决方案 修改ssh的配置文件 etc ssh sshd config xff0c
  • ubantu 18.x 学习记录

    安装net tools 用于 ifconfig命令 span class token function sudo span span class token function apt get span span class token fu

随机推荐