2022-JavaScript 中几个优雅的运算符使用技巧

ECMAScript 发展进程中,会有很多功能的更新,比如销毁,箭头功能,模块,它们极大的改变 JavaScript 编写方式,可能有些人喜欢,有些人不喜欢,但像每个新功能一样,我们最终会习惯它们。
新版本的 ECMAScript 引入了三个新的逻辑赋值运算符:空运算符,AND 和 OR 运算符,这些运算符的出现,也是希望让我们的代码更干净简洁,下面分享几个优雅的 JavaScript 运算符使用技巧。

一、可选链接运算符【?.】

可选链接运算符(Optional Chaining Operator) 处于 ES2020 提案的第 4 阶段,因此应将其添加到规范中。它改变了访问对象内部属性的方式,尤其是深层嵌套的属性。它也可以作为 TypeScript 3.7 + 中的功能使用。

相信大部分开发前端的的小伙伴们都会遇到 null 和未定义的属性。JS 语言的动态特性使其无法不碰到它们。特别是在处理嵌套对象时,以下代码很常见:

if (data && data.children && data.children[0] && data.children[0].title) {
    // I have a title!
}

上面的代码用于 API 响应,我必须解析 JSON 以确保名称存在。但是,当对象具有可选属性或某些配置对象具有某些值的动态映射时,可能会遇到类似情况,需要检查很多边界条件。

这时候,如果我们使用可选链接运算符,一切就变得更加轻松了。它为我们检查嵌套属性,而不必显式搜索梯形图。我们所要做的就是使用 “?” 要检查空值的属性之后的运算符。我们可以随意在表达式中多次使用该运算符,并且如果未定义任何项,它将尽早返回。

对于静态属性用法是:

object?.property

对于动态属性将其更改为:

object?.[expression] 

上面的代码可以简化为:

let title = data?.children?.[0]?.title;

然后,如果我们有:

let data;
console.log(data?.children?.[0]?.title) // undefined

data  = {children: [{title:'codercao'}]}
console.log(data?.children?.[0]?.title) // codercao

这样写是不是更加简单了呢?由于操作符一旦为空值就会终止,因此也可以使用它来有条件地调用方法或应用条件逻辑

const conditionalProperty = null;
let index = 0;

console.log(conditionalProperty?.[index++]); // undefined
console.log(index);  // 0

对于方法的调用你可以这样写

object.runsOnlyIfMethodExists?.()

例如下面的parent对象,如果我们直接调用parent.getTitle(), 则会报Uncaught TypeError: parent.getTitle is not a function错误,parent.getTitle?.()则会终止不会执行

let parent = {
    name: "parent",
    friends: ["p1", "p2", "p3"],
    getName: function() {
      console.log(this.name)
    }
  };
  
  parent.getName?.()   // parent
  parent.getTitle?.()  //不会执行
  

与无效合并一起使用

提供了一种方法来处理未定义或为空值和表达提供默认值。我们可以使用??运算符,为表达式提供默认值

console.log(undefined ?? 'codercao'); // codercao

因此,如果属性不存在,则可以将无效的合并运算符与可选链接运算符结合使用以提供默认值。

let title = data?.children?.[0]?.title ?? 'codercao';
console.log(title); // codercao
二、逻辑空分配(?? =)
expr1 ??= expr2

逻辑空值运算符仅在 nullish 值(null 或者 undefined)时才将值分配给 expr1,表达方式:

x ??= y

可能看起来等效于:

x = x ?? y;

但事实并非如此!有细微的差别。

空的合并运算符(??)从左到右操作,如果 x 不为 nullish 值则中表达式不执行。因此,如果 x 不为null 或者 undefined,则永远不会对表达式y进行求值。如果y是一个函数,它将根本不会被调用。因此,此逻辑赋值运算符等效于

x ?? (x = y);
三、逻辑或分配(|| =)

此逻辑赋值运算符仅在左侧表达式为 falsy 值(虚值) 时才赋值。Falsy 值(虚值)与 null 有所不同,因为 falsy 值(虚值)可以是任何一种值:undefined,null,空字符串 (双引号 “”、单引号’’、反引号 ``),NaN,0。IE 浏览器中的 document.all,也算是一个。

语法

x ||= y

等同于

x || (x = y)

在我们想要保留现有值(如果不存在)的情况下,这很有用,否则我们想为其分配默认值。例如,如果搜索请求中没有数据,我们希望将元素的内部 HTML 设置为默认值。否则,我们要显示现有列表。这样,我们避免了不必要的更新和任何副作用,例如解析,重新渲染,失去焦点等。我们可以简单地使用此运算符来使用 JavaScript 更新 HTML:

document.getElementById('search').innerHTML ||= '<i>No posts found matching this search.</i>'
四、逻辑与分配(&& =)

可能你已经猜到了,此逻辑赋值运算符仅在左侧为真时才赋值。因此:

x &&= y

等同于

x && (x = y)
最后

本次分享几个优雅的 JavaScript 运算符使用技巧,重点分享了可选链接运算符的使用,这样可以让我们不需要再编写大量我们例子中代码即可轻松访问嵌套属性。但是 IE 不支持它,因此,如果需要支持该版本或更旧版本的浏览器,则可能需要添加 Babel 插件。对于 Node.js,需要为此升级到 Node 14 LTS 版本,因为 12.x 不支持该版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习 JavaScript 需要从以下几个方面入手: 1. 了解 JavaScript 的基本语法,包括变量、数据类型、运算符、流程控制语句等。 2. 学习 JavaScript 的函数、数组、对象等常用的数据结构。 3. 了解 JavaScript 的 DOM(文档对象模型)和 BOM(浏览器对象模型),学会如何使用 JavaScript 操作网页元素。 4. 了解 JavaScript 的事件处理,学会如何使用 JavaScript 处理网页的各种事件。 5. 了解 JavaScript 的 AJAX(异步 JavaScript 和 XML),学会如何使用 JavaScript 实现网页的异步加载。 6. 学习 JavaScript 的高级应用,包括正则表达式、JSON、模块化等。 学习 JavaScript 的方法有很多,你可以选择在线教程、视频课程、书籍或者培训机构进行学习。在学习过程,认真完成课程练习和自己独立完成一些小项目都是很有帮助的。 ### 回答2: 学习Javascript可以按照以下步骤进行: 1. 了解基础知识:首先,可以通过学习Javascript的基本概念、语法和特性来入门。可以找一本入门教材、在线教程或者观看视频教程来帮助理解。 2. 实践编码:理论知识只是学习的一部分,更重要的是通过实践编码来巩固所学知识。可以选择一些简单的小项目来练习编写Javascript代码,并且要有耐心和毅力。 3. 参考文档和教程:在学习过程遇到问题时,可以查阅官方文档或者搜索相关问题的教程和解答。W3School、MDN等网站都提供了丰富的Javascript文档和教程。 4. 参与社区和讨论组:加入一些Javascript开发者的社区或者讨论组,与其他开发者交流经验和分享问题。在这些社区,可以获取到更多关于Javascript的实践经验和技巧。 5. 阅读优秀的代码:阅读其他经验丰富的Javascript开发者的优秀代码,可以从学习到一些优秀的编码习惯和解决问题的思路。 6. 持续学习和实践:学习Javascript是一个不断迭代的过程,持续学习和实践是必不可少的。跟随最新的Javascript趋势、了解新的开发框架和工具,并积极应用到实际项目。 总结起来,学习Javascript需要通过学习基础知识、实践编码、参考文档、参与社区、阅读优秀代码以及持续学习和实践等多个方面来提高自己的技能水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值