灵感闪现的 JS 实验,** 运算符怎么用【玩转JavaScript】

举报
叶一一 发表于 2023/08/22 16:28:22 2023/08/22
【摘要】 前言某天正在研读源码,突然发现一个有趣的代码段。这个代码段里包含一个运算,运算符是“**”。一般优先级相同的运算符做运算的时候,从左到右运算,不会添加额外的符号,比如小括号。通常是不同优先级的运算符做运算,才会为了保障运算结果的正确,添加小括号。所以这看似多余的代码,但是并不影响代码的正常运行,这是什么情况?让我们来一探究竟吧。** 运算符,相同运算符还要小括号?编程欢乐小剧场某:咦?一:干...

前言

某天正在研读源码,突然发现一个有趣的代码段。

这个代码段里包含一个运算,运算符是“**”。

一般优先级相同的运算符做运算的时候,从左到右运算,不会添加额外的符号,比如小括号。通常是不同优先级的运算符做运算,才会为了保障运算结果的正确,添加小括号。

所以这看似多余的代码,但是并不影响代码的正常运行,这是什么情况?让我们来一探究竟吧。


** 运算符,相同运算符还要小括号?

编程欢乐小剧场

某:咦?

一:干什么?

某:咦?咦?

一:干什么?干什么?

某:这个运算的小括号是不是多余了?

一:你猜呢。

某:你这样说,那应该不是多余的。

一:礼貌的笑一下吧。

某:但是为什么能运行呢,什么原理?

一:想听详细一点的解释,还是简单一点的解释。

某:简单的吧,我现在脑容量有限。

一:简单一点说,就是符合运算的结合性原理。

某:什么是运算的结合性?

一:我还是详细讲讲吧。

运算的结合性

运算的结合性指的是具有同等优先级的运算符将按照怎样的顺序进行运算。分为左结合和右结合两种。

左结合

一般优先级相同的运算符做运算的时候 ,结合性是左结合。

即:a + b + c 等于 (a + b) + c

右结合

一般优先级不同的运算符做运算的时候,结合性是右结合。

即:a + b * c 等于 a + (b * c)

幂运算(**)

幂运算符返回第一个操作数取第二个操作数的幂的结果。

结合性

幂运算符是右结合。

即:a ** b ** c 等于 a ** (b ** c)

看几个运算结果

console.log(2 ** 3 ** 2)   // > 512
console.log(2 ** (3 ** 2)) // > 512
console.log((2 ** 3) ** 2) // > 64

所以如果计算的时候,想从左向右运算,需要加小括号。

优先级

MDN 文档中没有直接说幂运算的优先级,但是我可以试:

console.log(2 * 3 ** 2); // 18
console.log(3 ** 2 * 2); // 18
console.log(2 + 3 ** 2); // 11
console.log(3 ** 2 + 2); // 11
console.log(2 - 3 ** 2); // -7
console.log(3 ** 2 - 2); // 7
console.log((-3) ** 2); // 9
console.log(-(3 ** 2)); // -9

根据这个结果,不难得出结论:

  • 幂运算的优先级高于基础的加减乘除运算符。
  • 不能将一元运算符(+/-/~/!/delete/void/typeof)放在底数之前。(这条是 MDN 文档里写的)

总结

来说一下实验的结论:

  1. 当不同的运算符进行运算的时候,优先级会影响你想要的运算结果。所以有必要进行适当了解。
  2. 幂运算是右结合,所以计算的时候注意顺序,如果有必要可以添加小括号。另外它其实等价于 Math.pow()。

本篇的灵感主要来自源码阅读。

前面看了几天源码,从源码中学习优秀的开发者的设计思维,减少低质量代码的产出。而前几天的文章中提到过,学习优秀开源项目的源码可以帮助扩展开发思维。

所以有了很不错的收获。

举例场景方面,本篇除了结合实际开发场景,部分实现方案其实也是来自源码中的代码。


作者:非职业「传道授业解惑」的开发者叶一一
简介:「趣学前端」、「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。