js实用好用的一些符号 ,你准没用过

 前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

前言

大家好,我是 simple ,我的理想是利用科技手段来解决生活中遇到的各种问题

按位取反运算符:~

对返回值进行按位取反(所有正整数的按位取反是其本身+1的负数,所有负整数的按位取反是其本身+1的绝对值,零的按位取反是 -1。其中,按位取反也会对返回值进行强制转换,将字符串5转化为数字5,然后再按位取反。false被转化为0,true会被转化为1。)

总之一句话:返回值会被乘于-1,然后再减1

~false === -1
~true === -2

indexOf通常找不到值就会返回-1,而在这里刚好可以为我所用

const arr = [1,2,3]
const index = arr.indexOf(4)
if(!~index) {
    console.log('没找到索引')
}

双位运算符 ~~

可以使用双位操作符来替代正数的 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

右移运算符 >>

运算符执行有符号右移位运算。与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。

举个例子:假设我们往右移动一位,其实就是除于2然后向下取整了,如果移动2位,就是除于4向下取整,以此类推,反正就是2的n次方。

4 >> 1 // 2
9 >> 1 // 4
15 >> 2 // 3

左移运算符 <<

同上,这里为乘,就不解释了

+ 正号

这个符号既是加号,也是正号,可以最优雅的将某个值转换成数字。

const timestamp = +new Date() // 时间戳
console.log(+'18' === 18) // true

空值合并运算符 ??

只有左侧的值为null或undefined的时候才使用右侧的值。

let obj = {age: 0, name: '', sex: null, has: false};
obj.has ?? '111'; // false
obj.age ?? '111'; // 0
obj.name ?? '111'; // ''
obj.sex ?? '111';  // 111
obj.addr ?? '111'; // 111

空值赋值运算符 ??=

和空值合并运算符??类似(可常量、可变量)。
当??=左侧的值为null、undefined的时候,会将右侧的值赋值给左侧变量。

let obj = {name: '', age: 0, has: false, sex: null}
obj.name ??= 'jack'
obj.age ??= 18
obj.has ??= true
obj.sex ??= 'man'
obj.add ??= '...'
console.log(obj) // {name: '', age: 0, has: false, sex: 'man', add: '...'}

可选链操作符 ?.

可选链操作符平时经常能看见,但是对象用中括号取值的时候可能就比较小众了。

let obj = {name: '', age: 0, has: false, sex: null}
obj?.['name']?.['length']
obj.getName?.()

使用BigInt支持大整数计算问题

es2020引入了一种新的数据类型 BigInt,用来表示任意位数的整数
例如

// 超过 53 个二进制位的数值(相当于 16 个十进制位),无法保持精度
Math.pow(2, 53) === Math.pow(2, 53) + 1 // true

// BigInt
BigInt(Math.pow(2, 53)) === BigInt(Math.pow(2, 53)) + BigInt(1) // false

除了使用BigInt来声明一个大整数,还可以使用数字后面加n的形式

1234 // 普通整数
1234n // BigInt

使用哈希前缀#将类字段设为私有

在类中通过哈希前缀#标记的字段都将被私有,子类实例将无法继承

例如

class Person {
    #privateField;
    #privateMethod() {
        return 'hello world';
    }
    constructor() {
        this.#privateField = 42;
    }
}

const instance = new Person()
console.log(instance.privateField); //undefined
console.log(instance.privateMethod); //undefined

可以看到,属性privateField和方法privateMethod都被私有化了,在实例中无法获取到

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

猜你喜欢

转载自blog.csdn.net/weixin_42981560/article/details/132513636