分享几个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修改table中Td的值(定义td的双击事件)
Jan 10 Javascript
ie中js创建checkbox默认选中问题探讨
Oct 21 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
html+js+highcharts绘制圆饼图表的简单实例
Aug 04 Javascript
移动适配的几种方案(三种方案)
Nov 25 Javascript
详解jQuery事件
Jan 13 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
Mar 09 Javascript
vue实现密码显示隐藏切换功能
Feb 23 Javascript
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
JavaScript 防篡改对象的用法示例
Apr 24 #Javascript
jquery插件实现悬浮的菜单
jquery插件实现代码雨特效
Apr 24 #jQuery
jquery插件实现搜索历史
Apr 24 #jQuery
关于Javascript闭包与应用的详解
vue首次渲染全过程
使用 JavaScript 制作页面效果
Apr 21 #Javascript
You might like
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
JS之小练习代码
2008/10/12 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
python实现车牌识别的示例代码
2019/08/05 Python
Python编程中类与类的关系详解
2019/08/08 Python
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
企业内控岗位的职责
2014/02/07 职场文书
学生期末评语大全
2014/04/30 职场文书
承诺书模板
2014/08/30 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
公司出差管理制度范本
2015/08/05 职场文书
节水宣传标语口号
2015/12/26 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫