分享几个JavaScript运算符的使用技巧


Posted in Javascript onApril 24, 2021

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

逻辑空值运算符仅在空值(空值或未定义)时才将值分配给expr1,表达方式:

x ??= y

可能看起来等效于:

x = x ?? y;

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

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

x ?? (x = y);

三、逻辑或分配(|| =)

此逻辑赋值运算符仅在左侧表达式为 falsy值时才赋值。Falsy与null有所不同,因为falsy可以是任何一种值:false,0,“”,null,undefined和NaN等

语法

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不支持该版本。

如果你也有优雅的优雅的JavaScript运算符使用技巧,请不要吝惜,在评论区一起交流~

以上就是分享几个JavaScript运算符的使用技巧的详细内容,更多关于JavaScript运算符的使用的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js获取某月的最后一天日期的简单实例
Jun 22 Javascript
Jquery的基本对象转换和文档加载用法实例
Feb 25 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
May 05 Javascript
jQuery操作动态生成的内容的方法
May 28 Javascript
xcode中获取js文件的路径方法(推荐)
Nov 05 Javascript
seajs中模块依赖的加载处理实例分析
Oct 10 Javascript
Node批量爬取头条视频并保存方法
Sep 20 Javascript
解决JS表单验证只有第一个IF起作用的问题
Dec 04 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
在vue项目中使用sass语法问题
Jul 18 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 Javascript
JavaScript 防篡改对象的用法示例
Apr 24 #Javascript
jquery插件实现悬浮的菜单
jquery插件实现代码雨特效
Apr 24 #jQuery
jquery插件实现搜索历史
Apr 24 #jQuery
关于Javascript闭包与应用的详解
vue首次渲染全过程
使用 JavaScript 制作页面效果
Apr 21 #Javascript
You might like
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
解析isset与is_null的区别
2013/08/09 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
Python实现快速计算词频功能示例
2018/06/25 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
工商管理应届生求职信
2013/10/07 职场文书
中年人生感言
2014/02/04 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
初中思品教学反思
2016/02/20 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
Python基础之进程详解
2021/05/21 Python