JS中一些高效的魔法运算符总结


Posted in Javascript onMay 06, 2021

JavaScript 现在每年都会发一个新版本,里面也会新增一些操作更加便利、高效的运算符。今天我们就来盘点下几个高效的魔法运算符。

1. 可选链运算符

之前当我们想要使用某个结构比较深的属性,同时又无法确定所有的父级一定存在时,我们需要进行一连串的判断,例如一个数据结构:

const student = {
  score: {
    math: 98,
  },
};

我们想要获取最内层的 math 属性的值时:

if (student && student.score) {
  console.log(student.score.math);
}

1.1 获取深层次的属性

不过当我们使用可选链运算符后,判断就简单很多了,可选链运算符会在链路上遇到 null 或者 undefined 时,直接返回 undefined,而不会抛出错误异常:

console.log(student?.score?.math);

1.2 执行一个可选的方法

同时在执行一个可能存在的函数时,也可以用到。例如一个 react 组件中,传入的方法是可选的:

// getScore 是一个可选参数,要么是 undefined,要么是一个函数
const Student = ({ getScore }: { getScore?: () => void }) => {
  useEffect(() => {
    // 当 getScore 存在时,正常执行 getScore()方法
    getScore?.();
  }, []);

  return <div></div>;
};

或者我们执行一个 dom 元素的方法时,也可以使用。

document.querySelector 会返回两种类型,当 dom 元素真实存在时会返回该元素,否则返回 null。写过 typescript 的都知道,当我们要调用某个方法时,总是要先确定该 dom 元素是存在的:

const dom = document.querySelector('.score');
if (dom) {
  dom.getBoundingClientRect(); // 当 dom 元素存在时,才执行该方法
}

使用可选链操作符时,就直接调用即可:

document.querySelector('.score')?.getBoundingClientRect();

1.3 获取数组中的值

若数组存在,则获取某个下标的值,我们现在也不用再判断数组是否存在了,可以直接使用:

arr?.[1]; // 若 arr 存在时,则正常获取 arr[1]中的值

上面的 3 种情况也是可以组合使用的。若一个结构比较复杂时,各种类型都有,这里我们要执行数组 math 下标 2 的方法:

const student = {
  score: {
    math: [
      98,
      67,
      () => {
        return 99;
      },
    ],
  },
};

执行:

student?.score?.math?.[2]?.(); // 99

还有这种操作?

1.4 无法进行赋值操作

可选链运算符只能执行获取操作,是无法进行赋值操作的。

例如给一个可能的数组或者 dom 元素赋值时,会直接抛出语法异常:

arr?.[1] = 2; // x
document.querySelector('.score')?.innerHTML = 98; // x

当我们执行上面的语句时,会抛出如下的提示:

Uncaught SyntaxError: Invalid left-hand side in assignment

即不能给左侧的可选链进行赋值操作。

2. 双问号运算符

双问号运算符??,我理解是为了解决或运算符||而设计出来的。

我们先来回顾下或运算符的操作,当左侧的数据为假值(数字 0, 布尔类型的 false,空字符串,undefined, null)时,则执行右侧的语句。

false || 123;
0 || 123;
'' || '123';
undefined || 123;
null || 123;

可是在有些情况下,false 和 0 都是正常的值,但若使用或运算符时,会导致出错。

比如下面的这个例子,当 score 为空时,则默认值为 1。当输入正常值 0 时应当返回 0(但实际上返回了 1):

const getSCore = (score: number) => {
  return score || 1;
};

getScore(0); // 1

这时,我们就用到了双问号运算符??。双问号运算符只会在左侧为 undefined 或者 null 时,才会执行右侧的语句。

const getSCore = (score: number) => {
  return score ?? 1;
};

getScore(0); // 0

同时,双问号运算符还可以与=结合成为一个赋值操作,当左侧为 null 或者 undefined 时,则将右侧语句的结果赋值给左侧的变量:

score ??= 1; // 1

我读书多,不会骗你

3. 或运算和与运算的赋值操作

我们在之前使用或运算符进行赋值操作时,是这样写的:

score = score || 1;
age = age && 24;

现在可以直接简写成:

score ||= 1; // 等同于 score = score || 1
age &&= 24; // 等同于 age = age && 24

4. 双星号运算符

双星号运算符**是比较早引入到 js 中的,只是我们用到的比较少而已。其实它执行的是一个幂运算,等同于 Math.pow()。

2 ** 10; // 1024, 2的10次方,等同于 Math.pow(2, 10);

5. 总结

以上所有的样例均已在 chrome90 上运行通过。

我们在已经有 babel 帮助转换的情况下,可以适当的在代码运用这些运算符,能够极大地简化我们的代码。

到此这篇关于JS中一些高效运算符总结的文章就介绍到这了,更多相关JS高效运算符内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
不用写JS也能使用EXTJS视频演示
Dec 29 Javascript
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
Nov 29 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
jquery中实现时间戳与日期相互转换
Apr 12 Javascript
浅析Bootstrap组件之面板组件
May 04 Javascript
js仿百度切换皮肤功能(html+css)
Jul 10 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 Javascript
利用jquery如何从json中读取数据追加到html中
Dec 01 jQuery
express中static中间件的具体使用方法
Oct 17 Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
如何制作自己的原生JavaScript路由
May 05 #Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
You might like
php 各种应用乱码问题的解决方法
2010/05/09 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python算法表示概念扫盲教程
2017/04/13 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
基于python生成器封装的协程类
2019/03/20 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
专科文秘应届生求职信
2013/11/18 职场文书
销售经理工作职责
2014/02/03 职场文书
小学生演讲稿大全
2014/04/25 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
财务整改报告范文
2014/11/05 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
昆虫记读书笔记
2015/06/26 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang