js小众且好用的技巧【符号篇】

前言

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

按位取反运算符:~

对返回值进行按位取反(所有正整数的按位取反是其本身+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      

~~4.9 === 4      

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

~~4.5                
Math.floor(4.5)      
Math.ceil(4.5)       

~~-4.5          
Math.floor(-4.5)     
Math.ceil(-4.5)      

右移运算符 >>

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

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

4 >> 1 
9 >> 1 
15 >> 2 

左移运算符 <<

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

+ 正号

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

const timestamp = +new Date() 
console.log(+'18' === 18) 

空值合并运算符 ??

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

let obj = {age: 0, name: '', sex: null, has: false};
obj.has ?? '111'; 
obj.age ?? '111'; 
obj.name ?? '111'; 
obj.sex ?? '111';  
obj.addr ?? '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) 

可选链操作符 ?.

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

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

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

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

Math.pow(2, 53) === Math.pow(2, 53) + 1 


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

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

1234 
1234n 

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

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

例如

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

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

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

相关文章

js小众且好用的技巧【一行代码】[1]
js小众且好用的技巧【api】[2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web面试那些事儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值