前端面试题库 (面试必备) 推荐:★★★★★
地址:前端面试题库
前言
大家好,我是 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
都被私有化了,在实例中无法获取到
前端面试题库 (面试必备) 推荐:★★★★★
地址:前端面试题库