我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS中强大的操作符有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS中强大的操作符有哪些

本篇内容主要讲解“JS中强大的操作符有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中强大的操作符有哪些”吧!

1. 数值分割符 _

ES2021 引入了数值分割符 _,在数值组之间提供分隔,使一个长数值读起来更容易。Chrome 已经提供了对数值分割符的支持,可以在浏览器里试起来。

let number = 100_0000_0000_0000 // 0太多了不用数值分割符眼睛看花了  console.log(number)             // 输出 100000000000000

此外,十进制的小数部分也可以使用数值分割符,二进制、十六进制里也可以使用数值分割符。

0x11_1 === 0x111   // true 十六进制  0.11_1 === 0.111   // true 十进制的小数  0b11_1 === 0b111   // true 二进制

2. 逗号运算符 ,

什么,逗号也可以是运算符吗?是的,曾经看到这样一个简单的函数,将数组的第一项和第二项调换,并返回两项之和:

function reverse(arr) {      return [arr[0], arr[1]]=[arr[1], arr[0]], arr[0] + arr[1]  }  const list = [1, 2]  reverse(list)   // 返回 3,此时 list 为[2, 1]

逗号操作符对它的每个操作数求值(从左到右),并返回最后一个操作数的值。

expr1, expr2, expr3...

会返回最后一个表达式 expr3 的结果,其他的表达式只会进行求值。

3. 零合并操作符 ??

零合并操作符 ?? 是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回右侧操作数,否则返回左侧操作数。

expr1 ?? expr2

空值合并操作符一般用来为常量提供默认值,保证常量不为 null 或者 undefined,以前一般使用 || 来做这件事 variable = variable || 'bar'。然而,由于 || 是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值(0, '', NaN, null, undefined)都不会被返回。这导致如果你使用 0、''、NaN 作为有效值,就会出现不可预料的后果。

正因为 || 存在这样的问题,而 ?? 的出现就是解决了这些问题,?? 只会在左侧为 undefined、null 时才返回后者,?? 可以理解为是 || 的完善解决方案。

可以在浏览器中执行下面的代码感受一下:

undefined || 'default' // 'default'  null || 'default'      // 'default'  false || 'default'     // 'default'  0 || 'default'         // 'default'  undefined ?? 'default' // 'default'  null ?? 'default'      // 'default'  false ?? 'default'     // 'false'  0 ?? 'default'         // 0

另外在赋值的时候,可以运用赋值运算符的简写 ??=

let a = {b: null, c: 10}  a.b ??= 20  a.c ??= 20  console.log(a)     // 输出 { b: 20, c: 10 }

4. 可选链操作符 ?.

可选链操作符 ?. 允许读取位于连接对象链深处的属性的值,而不必验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为 null 或者 undefined 的情况下不会引起错误,该表达式短路返回值是 undefined。

当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。

const obj = {    a: 'foo',    b: {      c: 'bar'    }  }  console.log(obj.b?.c)      // 输出 bar  console.log(obj.d?.c)      // 输出 undefined  console.log(obj.func?.())  // 不报错,输出 undefined

以前可能会通过 obj && obj.a && obj.a.b 来获取一个深度嵌套的子属性,现在可以直接 obj?.a?.b 即可。

可选链除了可以用在获取对象的属性,还可以用在数组的索引 arr?.[index],也可以用在函数的判断 func?.(args),当尝试调用一个可能不存在的方法时也可以使用可选链。

调用一个对象上可能不存在的方法时(版本原因或者当前用户的设备不支持该功能的场景下),使用可选链可以使得表达式在函数不存在时返回 undefined 而不是直接抛异常。

const result = someInterface.customFunc?.()

5. 私有方法/属性

在一个类里面可以给属性前面增加 # 私有标记的方式来标记为私有,除了属性可以被标记为私有外,getter/setter 也可以标记为私有,方法也可以标为私有。

class Person {    getDesc(){       return this.#name +' '+ this.#getAge()    }      #getAge(){ return this.#age } // 私有方法    get #name(){ return 'foo' } // 私有访问器    #age = 23                   // 私有属性  }  const a = new Person()  console.log(a.age)       // undefined 直接访问不到  console.log(a.getDesc()) // foo 23

6. 位运算符 >> 与 >>>

有符号右移操作符 >> 将第一个操作数向右移动指定的位数,多余的位移到右边被丢弃,高位补其符号位,正数补 0,负数则补 1。因为新的最左位与前一个最左位的值相同,所以符号位(最左位)不会改变。

(0b111>>1).toString(2)   // "11"  (-0b111>>1).toString(2)  // "-100" 感觉跟直觉不一样

正数的好理解,负数怎么理解呢,负数在计算机中存储是按照补码来存储的,补码的计算方式是取反加一,移位时将补码形式右移,最左边补符号位,移完之后再次取反加一求补码获得处理后的原码。

-111      // 真值  1 0000111 // 原码(高位的0无所谓,后面加不到)  1 1111001 // 补码  1 1111100 // 算数右移  1 0000100 // 移位后求补码获得原码  -100      // 移位后的真值

一般我们用 >> 来将一个数除 2,相当于先舍弃小数位然后进行一次 Math.floor:

10 >> 1    // 5  13 >> 1    // 6 相当于  13.9 >> 1  // 6  -13 >> 1   // -7 相当于  -13.9 >> 1 // -7

无符号右移操作符 >>>,将符号位作为二进制数据的一部分向右移动,高位始终补 0,对于正整数和算数右移没有区别,对于负数来说由于符号位被补 0,成为正数后就不用再求补码了,所以结果总是非负的。即便右移 0 个比特,结果也是非负的。

(0b111>>>1).toString(2)   // "11"  (-0b111>>>1).toString(2)  // "1111111111111111111111111111100"

可以这样去理解

-111      // 真值  1 000000000000000000000000000111 // 原码  1 111111111111111111111111111001 // 补码  0 111111111111111111111111111100 // 算数右移(由于右移后成为正数,就不要再求补码了)  1073741820      // 移位后的真值

左移运算符 << 与之类似,左移很简单左边移除最高位,低位补 0:

(0b1111111111111111111111111111100<<1).toString(2)   // "-1000"  (0b1111111111111111111111111111100<<<1).toString(2)  // "-1000"

  PS:JS 里面没有无符号左移,而且其他语言比如 JAVA 也没有无符号左移。

7. 位运算符 & 与 |

位运算符是按位进行运算,& 与、| 或、~ 非、^ 按位异或:

&: 1010  |: 1010  ~: 1010  ^: 1010     0110     0110              0110     ----     ----     ----     ----     0010     1110     0101     1100

使用位运算符时会抛弃小数位,我们可以利用这个特性来给数字取整,比如给任意数字 & 上二进制的 32 个 1,或者 | 上 0,显而易见后者简单些。

所以我们可以对一个数字 | 0 来取整,负数也同样适用

1.3 | 0         // 1  -1.9 | 0        // -1

判断奇偶数除了常见的取余 % 2 之外,也可以使用 & 1,来判断二进制数的最低位是不是 1,这样除了最低位之外都被置 0,取余的结果只剩最低位,是不是很巧妙。负数也同样适用:

const num = 3  !!(num & 1)                    // true  !!(num % 2)                    // true

8. 双位运算符 ~~

可以使用双位操作符来替代正数的 Math.floor( ),替代负数的 Math.ceil( )。双否定位操作符的优势在于它执行相同的操作运行速度更快。

Math.floor(4.9) === 4      // true  // 简写为: ~~4.9 === 4      // true

不过要注意,对正数来说 ~~ 运算结果与 Math.floor( ) 运算结果相同,而对于负数来说与 Math.ceil( ) 的运算结果相同:

~~4.5                // 4  Math.floor(4.5)      // 4  Math.ceil(4.5)       // 5   ~~-4.5               // -4  Math.floor(-4.5)     // -5  Math.ceil(-4.5)      // -4

PS:注意 ~~(num/2) 方式和 num >> 1 在值为负数时的差别

9. 短路运算符 && 与 ||

我们知道逻辑与 && 与逻辑或 || 是短路运算符,短路运算符就是从左到右的运算中前者满足要求,就不再执行后者了。

可以理解为:

  •  && 为取假运算,从左到右依次判断,如果遇到一个假值,就返回假值,以后不再执行,否则返回最后一个真值

  •  || 为取真运算,从左到右依次判断,如果遇到一个真值,就返回真值,以后不再执行,否则返回最后一个假值 

let param1 = expr1 && expr2  let param2 = expr1 || expr2
运算符示例说明
&&expr1&&expr2如果 expr1 能转换成 false 则返回 expr1,否则返回 expr2。 因此,在 Boolean 环境中使用时, 两个操作结果都为 true 时返回 true,否则返回 false
||expr1||expr2如果 expr1 能转换成 true 则返回 expr1,否则返回 expr2。 因此,在 boolean 环境(在if的条件判断中)中使用时, 二者操作结果中只要有一个为 true,返回 true;二者操作结果都为 false 时返回 false
!!expr如果单个表达式能转换为 true 的话返回 false,否则返回 true

因此可以用来做很多有意思的事,比如给变量赋初值:

let variable1  let variable2 = variable1  || 'foo'

如果 variable1 是真值就直接返回了,后面短路就不会被返回了,如果为假值,则会返回后面的foo。

也可以用来进行简单的判断,取代冗长的if语句:

let variable = param && param.prop  // 有了可选链之后可以直接 param?.prop

如果 param 如果为真值则返回 param.prop 属性,否则返回 param 这个假值,这样在某些地方防止 param 为 undefined 的时候还取其属性造成报错。

10. void 运算符

void 运算符 对给定的表达式进行求值,然后返回 undefined

可以用来给在使用立即调用的函数表达式(IIFE)时,可以利用 void 运算符让 JS 引擎把一个 function 关键字识别成函数表达式而不是函数声明。

function iife() { console.log('foo') }()       // 报错,因为JS引擎把IIFE识别为了函数声明

void function iife() { console.log('foo') }()  // 正常调用  ~function iife() { console.log('foo') }()      // 也可以使用一个位操作符  (function iife() { console.log('foo') })()     // 或者干脆用括号括起来表示为整体的表达式

还可以用在箭头函数中避免传值泄漏,箭头函数,允许在函数体不使用括号来直接返回值。这个特性给用户带来了很多便利,但有时候也带来了不必要的麻烦,如果右侧调用了一个原本没有返回值的函数,其返回值改变后,会导致非预期的副作用。

const func = () => void customMethod() // 特别是给一个事件或者回调函数传一个函数时

安全起见,当不希望函数返回值是除了空值以外其他值,应该使用 void 来确保返回 undefined,这样,当 customMethod 返回值发生改变时,也不会影响箭头函数的行为。

11. 其他常用操作符

1. 三元表达式:很简单了,大家经常用,expr ? expr1 : expr2 如果 expr 为真值则返回 expr1,否则返回 expr2

2. 赋值运算符简写:加法赋值 +=、减法赋值 -=、乘法赋值 *=、除法赋值 /=、求幂赋值 **=、按位或复制 |=、按位与赋值 &=、有符号按位右移赋值 >>=、无符号按位右移赋值 >>>=、逻辑空赋值 ??= ....

3. 求幂运算符:var1 ** var2 相当于 Math.pow,结果为 var1 的 var2 次方

12. 操作符优先级

正因为有操作符优先级,所以 variable = 1, 2 的含义是将变量先赋值为 1,再返回数字 2,而不是变量赋值给 1, 2 的返回值 2,这是因为 = 运算符的优先级高于 , 逗号运算符。再比如表达式 6 - 2 * 3 === 0 && 1,- * === && 这四个运算符优先级最高的 * 先运算,然后 - 运算符结果为 0,=== 运算符优先级高于 && 而 true && 1 的结果为 1,所以这就是运算的结果。

下面的表将运算符按照优先级的不同从高(20)到低(1)排列,但这个不是最新的,至少没包括可选链,建议参考这个表或者 MDN。

JS中强大的操作符有哪些

到此,相信大家对“JS中强大的操作符有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS中强大的操作符有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript中有哪些强大的运算符

小编给大家分享一下JavaScript中有哪些强大的运算符,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、??空值合并运算符如果你第一次遇到它,看到的是两个问号,估计脑海里还有更多的问号(小朋友,你是否有很多问号~~~)
2023-06-25

ECMAScript中都有哪些操作符

这篇文章主要讲解了“ECMAScript中都有哪些操作符”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ECMAScript中都有哪些操作符”吧!目录一元操作符布尔操作符乘性操作符加性操作符关
2023-06-20

VB.NET操作符有哪些

这篇文章主要为大家展示了“VB.NET操作符有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET操作符有哪些”这篇文章吧。在本文中将会用到一个自定义类dog ,代码如下:Public
2023-06-17

c++操作符有哪些

c++ 提供广泛的运算符集,分类如下:算术运算符(+、-、*、/、%、++、--)赋值运算符(=、+=、-=、*=、/=、%=)比较运算符(==、!=、、=)逻辑运算符(&、|、^、!)位运算符(&、|、^、>)指针运算符(*、&、->)其
c++操作符有哪些
2024-04-22

python中有哪些列表操作符

本篇文章给大家分享的是有关python中有哪些列表操作符,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,开发程序
2023-06-14

LINQ中有哪些查询操作符

这篇文章给大家介绍LINQ中有哪些查询操作符,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。操作符和LINQLINQ自身功能非常强大,无论使用的是LINQto XML、LINQto DataSets、LINQto Ent
2023-06-17

VB.NET中有哪些特殊操作符

这篇文章将为大家详细讲解有关VB.NET中有哪些特殊操作符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。VB.NET特殊操作符的小例子如下:Dim a As New dog Dim b
2023-06-17

Python中有哪些字符基本操作

Python中有哪些字符基本操作,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一. Python字符的表示用单引号或双引号构成字符串。“abc” \ &lsq
2023-06-17

Oracle中字符操作函数有哪些

小编给大家分享一下Oracle中字符操作函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!字符操作函数 CONCAT
2023-06-03

实用的TypeScript操作符有哪些

这篇文章主要介绍“实用的TypeScript操作符有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“实用的TypeScript操作符有哪些”文章能帮助大家解决问题。1. 非空断言操作符非空断言操作
2023-07-05

Python中的字符串操作函数有哪些?

Python作为一门强大的编程语言,提供了许多有用的字符串操作函数,用于处理和操作字符串数据。本文将介绍Python中常用的字符串操作函数,并提供一些具体的代码示例。len() 函数:用于计算字符串的长度。示例代码:string = "He
2023-10-22

Python中的字符串操作技巧有哪些?

Python中的字符串操作技巧有哪些?字符串操作是Python编程中非常常见和重要的一部分。Python提供了许多内置函数和方法来进行字符串操作,让我们能够高效地处理和处理文本数据。下面我将介绍一些常用的字符串操作技巧,并给出具体的代码示例
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录