javascript大法大全

206 阅读5分钟

for的各种循环

1、for 循环

let arr = [1,2,3];
for (let i=0; i<arr.length; i++){
 console.log(i,arr[i])
}
// 0 1
// 1 2
// 2 3

for 循环是 Js 中最常用的一个循环工具,经常用于数组的循环遍历。

2、for in 循环

let obj = {name:'zhou',age:'**'}
for(let i in obj){
 console.log(i,obj[i])
}
// name zhou
// age **

for in 循环主要用于遍历普通对象,i 代表对象的 key 值,obj[i] 代表对应的 value

3、for of 循环

let arr = ['name','age'];
for(let i of arr){
 console.log(i)
}
// name
// age

for of 循环是 Es6 中新增的语句,用来替代 for in 和 forEach,它允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代(Iterable data)的数据结构,注意它的兼容性。

4、Array forEach 循环

let arr = [1,2,3];
arr.forEach(function(i,index){
 console.log(i,index)
})
// 1 0
// 2 1
// 3 2

forEach循环,循环数组中每一个元素并采取操作, 没有返回值, 可以不用知道数组长度,他有三个参数,只有第一个是必需的,代表当前下标下的 value。

5、Array map()方法

let arr = [1,2,3];
let tt = arr.map(function(i){
 console.log(i)
 return i*2;
})
// [2,4,6]

let arr = [{
	age: 25,
	address: '你猜'
}, {
	age: 40,
	address: '你猜'
}, {
	age: 30,
	address: '你猜'
}]
// 此时我们要把年龄都加上2
arr = arr.map(item => {
	item.age += 2
	return item
})

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
注意:map 和 forEach 方法都是只能用来遍历数组,不能用来遍历普通对象。

6、Array filter() 方法

let numbers = ['001','003','004','005','006','007','008','009','010','011','018','019']
arr.filter(item =>{return !numbers.includes(item.groupCode)}) // 多个条件let arr = [
      { name:'小明',sex:0,age:9},
      { name:'小红',  sex:1,  age:9},
      { name:'小亮', sex:0, age:10 }
]
arr.filter(item => item.age === 9)

// 去掉数组空字符串、undefined、null
let arr2 = [ 1,3,5,null,4,undefined,10,'hahah','','end' ];
console.log(arr2.filter(item => item));
结果为:[1, 3, 5, 4, 10, "hahah", "end"]

// 数组去重的用法
let arr3 = [ 1,3,3,6,5,5,8,9,8,'hahah','wer','hahah' ];
console.log(arr3.filter((item,index,self) => self.indexOf(item) == index));

filter 方法是 Array 对象内置方法,它会返回通过过滤的元素,不改变原来的数组。

7、Array some() 方法

let arr = [1,2,3];
let tt = arr.some(function(i){
 return i>1;
})
// true

some() 方法用于检测数组中的元素是否满足指定条件(函数提供),返回 boolean 值,不改变原数组。

8、Array every() 方法

let arr = [1,2,3];
let tt = arr.some(function(i){
 return i>1;
})
// 检测数组中元素是否都大于1
// false

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供),返回 boolean 值,不改变原数组。

9、Array reduce()方法

let arr = [1,2,3];
let ad = arr.reduce(function(i,j){
 return i+j;
})
// 6

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

数组去重

1.利用Array.from与set去重

function unique(arr) {
  if (!Array.isArray(arr)) {
    console.log("type error!");
    return;
  }
  return Array.from(new Set(arr));
} 

关于转换

数组转化为对象(Array to Object)

const arr = [1,2,3]
const obj = {...arr}
console.log(obj)
Output:{0: 1, 1: 2, 2: 3} 

转换为数字类型

这种是很常见的,大家用的比较多的可能是parseInt()Number()这种:

const age = "69";
const ageConvert = parseInt(age);
console.log(typeof ageConvert);

Output: number; 

其实也可以通过+来实现转换:

const age = "69";
const ageConvert = +age;
console.log(typeof ageConvert);

Output: number; 

转换为字符串类型

转换为字符串一般会用toString()String()实现:

let a = 123;
a.toString(); // '123' 

但也可以通过value + ""这种来实现:

let a = 123;
a + ""; // '123' 

合并对象/数组

1.对象合并

const obj1 = { a: 1 }
const obj2 = { b: 2 }
const combinObj = { ...obj1, ...obj2 }
console.log(combinObj)

Output:{ a: 1, b: 2 }

2.合并数组

es6提供了一个新方法 flat(depth),参数depth,代表展开嵌套数组的深度,默认是1

let arr = [1, [2, 3, [4, [5]]]];
arr.flat(3); // [1,2,3,4,5]

3.reduce也可以合并数组,但这里介绍reduce求和

var arr = [1,2,3,4]
var sum = arr.reduce(function (prev, cur) {
    return prev + cur;
},0);
console.log(sum) //10

var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];
var sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);
console.log(sum) //60

截断数组

1.如果你有修改数组长度为某固定值的需求,那么你可以试试这个

let array = [0, 1, 2, 3, 4, 5];
array.length = 3;
console.log(array);

Output: [0, 1, 2]; 

2.获取数组数组一项

let arr = [0, 1, 2, 3, 4, 5];
const last = arr[arr.length - 1];
console.log(last);

Output: 5;

但我们也可以通过slice操作来实现:

let arr = [0, 1, 2, 3, 4, 5];
const last = arr.slice(-1)[0];
console.log(last);

Output: 5;

拷贝数组

1.Array.slice

const arr = [1, 2, 3, 4, 5];
const copyArr = arr.slice();

2.展开操作符

const arr = [1, 2, 3, 4, 5];
const copyArr = [...arr]

3.使用 Array 构造函数和展开操作符

const arr = [1, 2, 3, 4, 5];
const copyArr = new Array(...arr)

4.Array.concat

const arr = [1, 2, 3, 4, 5];
const copyArr = arr.concat();

喜欢第二个。♥

避免多条件并列

开发中有时会遇到多个条件,执行相同的语句,也就是多个||这种:

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

这种写法语义性、可读性都不太好。可以通过switch caseincludes这种进行改造。

1.switch case

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

2.includes

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

条件语句的优化

// 根据颜色找出对应的水果
// bad
function test(color) {
  switch (color) {
    case 'red':
      return ['apple', 'strawberry'];
    case 'yellow':
      return ['banana', 'pineapple'];
    case 'purple':
      return ['grape', 'plum'];
    default:
      return [];
  }
}

test('yellow'); // ['banana', 'pineapple']

// good
const fruitColor = {
  red: ['apple', 'strawberry'],
  yellow: ['banana', 'pineapple'],
  purple: ['grape', 'plum']
};

function test(color) {
  return fruitColor[color] || [];
}

// better
const fruitColor = new Map()
  .set('red', ['apple', 'strawberry'])
  .set('yellow', ['banana', 'pineapple'])
  .set('purple', ['grape', 'plum']);

function test(color) {
  return fruitColor.get(color) || [];
}

浮点数转为整数

我们一般将浮点数转化为整数会用到Math.floor()Math.ceil()Math.round()。但其实有一个更快的方式:

console.log(~~6.95); // 6
console.log(6.95 >> 0); // 6
console.log(6.95 << 0); // 6
console.log(6.95 | 0); // 6
// >>>不可对负数取整
console.log(6.95 >>> 0); // 6 

性能追踪

1.如果你想测试一段js代码的执行耗时,那么你可以尝试下performance

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

2.还有另外一种方法:

console.time('时间执行');
console.timeEnd('时间执行') 

以上皆是转载里然后合并自己喜欢的函数。