余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

几个优雅的JavaScript运算符使用技巧(javascript三目运算符)

xiyangw 2022-11-26 17:10 15 浏览 0 评论

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

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

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

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

几个优雅的JavaScript运算符使用技巧(javascript三目运算符)

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

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

x ??= y

可能看起来等效于:

x = x ?? y;

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

空的合并运算符(??)从左到右操作,如果x不为空,则短路。因此,如果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)

相关推荐

捍卫非法加密货币采矿活动(加密货币非法交易)
捍卫非法加密货币采矿活动(加密货币非法交易)

网络套图什么是加密货币?加密货币是一种用作交换媒介的数字货币,与其他货币相似。比特币,莱特币,门罗币,以太坊和瑞波币只是可用的几种加密货币类型。与其他货币不同,...

2023-03-21 19:41 xiyangw

网页禁止复制操作实现方法汇总(网页禁止复制 js)
网页禁止复制操作实现方法汇总(网页禁止复制 js)

我们经常在某些网站上复制内容的时候发现,竟然复制不了。友好的交互还会弹窗告诉你,登陆后才能复制哦。那么网站是如何阻止用户复制的呢?今天帮大家汇总一下能够实现的方...

2023-03-21 19:40 xiyangw

iOS 9.3再曝URL崩溃漏洞,苹果啊你到底上不上心啊
iOS 9.3再曝URL崩溃漏洞,苹果啊你到底上不上心啊

在苹果iOS9.3正式推送之后,很多用户都已经升级到了这个最新的系统,iOS9.3带来的夜间模式、备忘录加密等功能受到了很多用户的欢迎,在稳定性方面也...

2023-03-21 19:40 xiyangw

网络安全之文件上传,看这一篇就够了(网络安全文稿)
网络安全之文件上传,看这一篇就够了(网络安全文稿)

概述文件上传漏洞是发生在有上传功能的应用中,如果应用程序对用户的上传文件没有控制或者存在缺陷,攻击者可以利用应用上传功能存在的缺陷,上传木马、病毒等有危害的文件...

2023-03-21 19:39 xiyangw

前端经典面试题(60道前端面试题包含JS、CSS、React、程序题等)上

文章转载:乐字节简答题1、什么是防抖和节流?有什么区别?如何实现?参考答案防抖触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间思路:每次触发事件时都取消之前的延时调用...

JavaScript语言中的变量(js变量作用范围)
JavaScript语言中的变量(js变量作用范围)

JavaScript中变量是用于存储数据值的容器,举个例子,例如vara=1,其中a就是一个变量,1是存入变量的值,也叫做字面量。在实际应用...

2023-03-21 19:38 xiyangw

JavaScript面试题(javascript面试题及答案)

1.javaScript的数据类型有什么基本数据类型:Undefined、Null、Boolean、Number、String、Object、Symbol(es6--原始数据类型)复杂数据类型:obj...

JAVA应用程序集成控件JxBrowser v7.2来啦!允许自定义错误页面
JAVA应用程序集成控件JxBrowser v7.2来啦!允许自定义错误页面

JxBrowser是将基于Chromium的浏览器与Java应用程序集成,以处理和显示HTML5,CSS3,JavaScript,Flash等。JxBrowse...

2023-03-21 19:38 xiyangw

这款让浏览器失去功能的扩展为什么如此流行?
这款让浏览器失去功能的扩展为什么如此流行?

NoScript是一款知名的Firefox扩展,它会默认禁用JavaScript、Java、Flash、Sliverlight等浏览器脚本、插件,让用...

2023-03-21 19:38 xiyangw

Chrome禁用js规避网站不能复制(chrome 禁止跳转)
Chrome禁用js规避网站不能复制(chrome 禁止跳转)

Chrome禁用js规避网站不能复制有一些坑爹的网站不让复制文字,复制就得扫码关注或者付费之类的。作为白X党,怎么能忍受这个呢?在该网站页面,按住F12不松开,...

2023-03-21 19:37 xiyangw

苹果iOS9 Safari加入贴心功能:烦人弹窗请滚粗
苹果iOS9 Safari加入贴心功能:烦人弹窗请滚粗

苹果在最新的iOS9beta测试版中为手机版的Safari浏览器加入了一项十分实用的新功能,让用户们可以不用再忍受一些网站上的恶意行为。日前有不少用户在浏览网页...

2023-03-21 19:37 xiyangw

iOS 9.3应用链接失效可能是第三方应用所致(app内链接)
iOS 9.3应用链接失效可能是第三方应用所致(app内链接)

目前,苹果尚未就此事发表评论。威锋网讯,近日有用户指出,在升级iOS9.3后又发现了新的bug,具体表现为部分应用内的链接失效从而导致卡死、崩溃等情况...

2023-03-21 19:37 xiyangw

网页不能右键 F12 查看源代码解决方案(网站无法右键)
网页不能右键 F12 查看源代码解决方案(网站无法右键)

简单一种方法浏览器直接输入:view-source:网址或者使用快捷键为:Ctrl+UF12debug页面右键不能用的话,快捷键为:Ctrl+Shift+I再...

2023-03-21 19:37 xiyangw

新兴技术袭来,Web开发如何抉择?(新兴技术袭来,web开发如何抉择技术)
新兴技术袭来,Web开发如何抉择?(新兴技术袭来,web开发如何抉择技术)

【编者按】本文来自AListApart,重点讲述了开发者如何应对琳琅满目的新技术。作者建议,开发者在接受新概念的同时,更要重视对原始浏览器的支持,并增强用户...

2023-03-21 19:36 xiyangw

微软发现一种恶意软件新型下载方式——“HTML 走私”
微软发现一种恶意软件新型下载方式——“HTML 走私”

微软已经标记了一种相对较新的攻击方式,称为“HTML走私”,它被用于部署银行恶意软件和远程访问木马(RAT)的电子邮件活动,并作为有针对性的黑客攻击的一部...

2023-03-21 19:36 xiyangw

取消回复欢迎 发表评论: