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 相关文章推荐
jquery提示 &quot;object expected&quot;的解决方法
Dec 13 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
May 12 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
Dec 23 Javascript
Vue.js实现移动端短信验证码功能
Mar 29 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
Sep 19 Javascript
node.js命令行教程图文详解
May 27 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
javascript实现贪吃蛇小练习
Jul 05 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
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
常用DOM整理
2015/06/16 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
详解puppeteer使用代理
2018/12/27 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
python 查找字符串是否存在实例详解
2017/01/20 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
详解Django配置优化方法
2019/11/18 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
青年志愿者先进事迹
2014/05/06 职场文书
学雷锋的心得体会
2014/09/04 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
JavaScript组合继承详解
2021/11/07 Javascript
24年收藏2000多部退役军用电台
2022/02/18 无线电