也就是说,当你要访问某个对象的属性或者调用某个对象上的方法时,如果这个对象的值为 undefined 或者 null,那么语句执行就会报错,举例如下: 以往我们的解决方案是加一层判断,确保访问的对象不为 undefined 或者 null,我们才做后续操作,具体代码如下: 上面的代码虽然解决了问题,但是写起来太繁琐,不够优雅,所以新版 JS 增加了可选链操作符来简化这一过程。上面的代码用可选链操作符简化如下 所以 ?. 可选链操作符的作用就是,如果 demo 对象的 nickName 属性值不为 null 或 undefined 则调用其 toString() 方法,如果不存在则不调用,实际效果与上面的 if 判断是等价的。 ?? 只有当操作符左侧表达式的值为 undefined 或者 null 时,才会返回右侧的值。 只要操作符左侧表达式的值为 false 时,那么就会返回右侧的值。左侧的表达式会自动做布尔运算,因为 0 和 空字符串 做布尔运算,其值为 false,所以 o 和 p 的值等于 100。 通过上面的比较可以发现,?? 操作符的出现,是为了更准确的做空值判断,只有 null 和 undefined 才会被判定为空值, 0 和 不会被判定为空值。 只有当 ??= 左侧的值为 null 或者 undefined 的时候,才会将右侧变量的值赋值给左侧变量,其他所有值都不会进行赋值,在某些场景下可以省略很多代码。 |