# JS骚操作

js中一些简化操作

# 数组去重

双重for循环去重

function unique(arr){
    for(let i=0;i < arr.length; i++){
        for(let j=i+1;j < arr.length;j++){
            if(arr[i] === arr[j]){
                arr[j].splice(j,1);
                j--;
            }
        }
    }
    return arr
}

利用indexOf去重

function unique(arr){
    let newArray = []
    for(let i=0;i<arr.length;i++){
        if( newArray.indexOf(arr[i]) === -1 ){
            newArray.push(arr[i])
        }
    }
    return newArray;
}

使用Array.from()和new Set()去重

function unique(arr){
    return Array.from(new Set(arr));
}

# 数组转为对象

let arr = ["1","2","3"];
/* 常见处理 */
let obj = {};
for (let key in arr) {
    obj[key] = arr[key];
}
/* 精简类型 */
let obj = {...arrr}

# 类型转换

//string串转number
Number(string)
parseInt(string)
+string
//number转string
String(number)
number.toString()
number + ''

# 性能追踪

如果想测试一段代码的执行耗时,可以尝试使用performance

let start = performance.now();
let sum = 0;
for(let i=0;i<10000;i++){
	sum+=i;
}
let end = performance.now();
console.log(start)
console.log(end)

# 对象合并

let obj1 = {a:1}
let obj1 = {b:2}
//assgin合并方法
Object.assign(obj1,obj2)
//展开操作符合并方法
let con = {...obj1,...obj2}

# 短路运算

**我们可以通过 && 和 || 来简化我们的代码 **

if(ok){
	search();
}

//使用&&
ok && search();
//使用||
let name = null || 'hellow'

# 数组扁平化

let arr = [1, [2, [3, 4]]];

//递归实现
function flatten(arr){
	if(Array.isArray(arr)){
		return new Error('传入的值不是数组');
	}
	let result = []; 
	for(let i=0;i<arr.length;i++){
		if(Array.isArray(arr[i])){
			result = result.concat(flatten(arr[i]));
		}else{
			result.push(arr[i])
		}
	}
	return result;
}

//reduce方法实现
function flatten(arr) {
  return arr.reduce(function (prev, next) {
    return prev.concat(Array.isArray(next) ? flatten(next) : next);
  }, []);
}

//简易方法实现 flat(deep) deep是展开嵌套数组的深度
arr.flat(3)

# 求幂运算

比如实现$2^{10}$,使用JS编写:

//Math.pow(底数,幂数)
let num = Math.pow(2,10);
//es7添加了指数运算符号 **
let num = 2 ** 10;

# 浮点数转整数

Math.floor() //向上取整,直接去掉所有的小数
Math.ceil()  //向下取整,只要是有小数就 +1
Math.round() //四舍五入

//位运算符 ~~,>>,<<,| 都可以对负数取整   >>>不可对负数取整 都是实现Math.flooor()的功能
~~6.95     //6
6.95 >> 0  //6
6.95 << 0  //6
6.95 | 0   //6
6.95 >>> 0 //6
~6.95      //-7 实现了类似Math.ceil()的功能,但是会转成负数

# 获取数组的最后一项

arr[arr.length - 1];
let last = arr.slice(-1)[0];

# Object.create(null) 和 {}

//Object.create(proto,[propertiesObject]) proto是新创建对象的原型,propertiesObject是自身添加的可枚举的属性
let obj = Object.create(null,{
	a:{
		writable:true,
		configurable:true,
		value:"1"
	}
})

区别:
通过{}创建的对象继承了Object自身的方法,如hasOwnProperty、toString等,在新对象上可以直接使用。

而使用Object.create(null)创建的对象,除了自身属性a之外,原型链上没有任何属性。
也就是我们可以通过Object.create(null)这种方式创建一个纯净的对象,我们可以自己定义hasOwnProperty、toString等方法,完全不必担心会将原型链上的同名方法覆盖掉。

# 数组拷贝

let copyArr = arr.slice()
let copyArr = [...arr]
let copyArr = new Array(...arr)
let copyArr = arr.concat()

# 避免多条件并列

if (status === 'process' || status === 'wait' || status === 'fail') {
  doSomething()
}

//switch case 
switch(status) {
  case 'process':
  case 'wait':
  case 'fail':
    doSomething()
}

//includes
const enum = ['process', 'wait', 'fail']
if (enum.includes(status)) {
  doSomething()
}