JS快速高效开发技巧指南(持续更新)

简介: JavaScrpit代码简单明了,上手速度快,为了高效且优雅的开发,看官阁下不妨试试这篇技巧指南……

标题:JS高效开发技巧指南(持续更新中……建议点赞&收藏)

引言:JavaScrpit代码简单明了,上手速度快,为了高效且优雅的开发,看官阁下不妨试试这篇技巧指南,

1、数组篇

1.1、数组求和

类似可以求乘积

reduce:每次计算后它都会把值赋给curr,会冲掉数组中下个遍历的对象prev(特点);

eval:语句块执行;

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

let sum01 = arr.reduce((prev, curr) => prev + curr)
let sum02 = eval(arr.join('+'))

数组对象型属性求和

let arr02 = [{"age": 12}, {"age": 13}, {"age": 14}, {"age": 15}]

let sum03 = arr.reduce((prev, curr) => {
    console.log(prev)
    return prev + curr.age
}, 0);    // 使用reduce第二个参数:initialValue:设定开始的prev值,不然遍历对象会有问题。如果是空数组,也需要用到initialValue

1.2、获取最大/最小值

排序法求最值,apply活用求最值,语句块拼接求最值,reduce用法求最值

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

arr.sort((a, b)=>a-b)  // 生序
let min01 = arr[0]
let max01 = arr[arr.length - 1]

let min02 = eval(`Math.min(${arr.join(',')})`)
let max02 = eval(`Math.max(${arr.join(',')})`)

let min03 = Math.min.apply(null, arr)
let max03 = Math.max.apply(null, arr)

let min04 = arr.reduce((prev, curr) => prev > curr ? curr : prev)
let max04 = arr.reduce((prev, curr) =>  prev > curr ? prev : curr)

数组对象型属性求最大最小值:先将对象属性挑出来为单独数组,然后再按上述逻辑求最值

let arr = [{"age": 12}, {"age": 13}, {"age": 14}, {"age": 15}]

let arrAge = arr.map(item => item.age)

1.3、快速排序

字符串排序原理:比较每个字符的ASCII编码大小,若相同,则继续比较第二个字符……

数字:

let arr = [10, 1, 5, 9, 6, 8]

arr.sort((a, b)=>a-b)    // 生序
arr.sort((a, b)=>b-a) // 降序

字符串:

let arr = ['haha', 'hehe', 'hei', 'ai', 'ge']

arr.sort()    // 生序
arr.reverse()    // 降序

对象属性:

let arr = [{"name": "ha"}, {"name": "ws"}, {"name": "gw"}, {"name": "ts"}]

arr.sort((a, b) => a.name.localeCompare(b.name))    // 生序
arr.sort((a, b) => b.name.localeCompare(a.name))    // 降序

// 值为数字类似上文,-比对

1.4、数组初始化

知晓数组长度时的占位符预处理,可有效优化代码执行效率,避免底层反复扩容;

Array.from(arr, mapFun, thisArg):从指定数组基础上创建一个新数组(浅拷贝),如果指定mapFun了该参数,新数组中的每个元素都会执行该函数

// 创建长度为10的数组,初始化每个元素占位为0
let arr = Array(10).fill(0)

// 创建一个长宽都为10 的矩阵,(二维数组),元素占位为0
let arr = Array.from(Array(10).fill(0), () => Array(10).fill(0))

1.5、去重

巧用filter,还有Set,另外[...Array01, ...Array02, ...Array03],会将数组元素拼接成一个新的数组返回。

let arr = [1, 2, 3, 3, 2, 5, 7]

arr = arr.filter((item, index, array) => array.indexOf(item) === index)
arr = [...new Set(arr)]

1.6、数组合并

快速合并,返回新的数组

let arr = [...arr1, ...arr2, ...arr3]

2、对象篇

2.1、对象合并

注意:Object.assign():第一个参数最好写空对象,因为如果写的是实际对象,那么它会先合并到第一个对象上,然后再将其返回,会实际篡改第一个参数的原始值

let obj = Object.assign({}, obj1, obj2)

let obj0 = {...obj, ...obj1, ...obj2}

2.2、箭头函数

具有词法范围,即父范围,并没有属于自身的this,arguments,所以一般定义对象内部函数时用到的this,都是指代该对象。但是,定义函数别加:,不可这样用。

const a = {
    b: 'baba',
    m: () => {
        console.dir(this.b)    // 此时的this,就是个{},跟父范围无关
    }
}

// 推荐统一为:
const a = {
    b: 'baba',
    m() {
        console.dir(this.b)    // 输出 baba
    }
}

3、Math篇

3.1、巧用随机函数

1、获取指定范围的随机值

let n = Math.random(10);    // 取[0, 10)之间的随机数,左闭右开,如果无参就是取[0, 1)之间的

2、获取一个数组的随机下标(多用于IP列表下面的负载均衡,随机索引:在海量数据面前,随即就是均衡的)

let index = Math.floor(Math.random(arr.length));    // floor: 向下取整,舍去小数部分

3、用随机排序来打乱一个指定的数组

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

arr.sort(() => {
    return Math.random() - 0.5
})

4、函数篇

4.1、可变参数

function a(...args) {
    console.dir(args)   // 数组,
    console.dir(arguments)  // 对象,每一个函数都有自己的arguments
}

// 固定必传项,其余为可传
function b(p, ...args){
    console.dir(args)
      console.dir(arguments) 
}
a('a', 'b', 'c')
b('a', 'b', 'c')

4.2、默认参数

行参之间,后者可利用前者做默认设置

function a(arr, l = arr.length - 1) {
    console.log(l)
}

a([1, 2])
a('a', 2)

4.3、定义延时

js没有Java那种Thread.sleep(),但是可以利用async 和 await 自己定义延时。

/**
 * 定义sleep函数
 * @param interval
 * @returns {Promise<void>}
 */
async function sleep(interval) {
    await new Promise(r => setTimeout(r, interval));
}

async function doTings() {
    //……
    await sleep(1000);
    //……
}

4.4、定义重试

沿用上文的sleep函数,对目标函数进行循环重试

/**
 * @param fn: 目标函数
 * @param args: 目标函数参数列表
 * @param retriesMax: 最大重试次数
 * @returns {Promise<void>}
 */
async function retry(fn, args = [], retriesMax = 2) {
    for (let i = 0; i < retriesMax; i++) {
        try {
            return await fn.appply(null, args)
        } catch (error) {
            if (retriesMax === i + 1) {
                throw error;
            }
            await sleep(1000)
        }
    }
}

5、其他篇

5.1、空合并(??)

当左侧为null或者undefined时,返回右侧,(注意:数字0和 布尔false,并不属于null和undefined范畴)

let a = false ?? 'haha';    // a = false
let b = null ?? 'hehe';  // b = 'hehe'
let c = undefined ?? 'hihi'; // c = 'hihi'

5.2、对象属性分离

Object.keys:返回对象所有key的数组,Object.values:返回对象所有value的数组,Object.entries:返回对象key-value组成的二维数组

let obj = {name: 'ike', gender: true}

let keys = Object.keys(obj);
let values = Object.values(obj);
let entries = Object.entries(obj);    // 返回 [ [ 'name', 'ike' ], [ 'gender', true ] ]

5.3、去除字符串首尾空格

对比正则表达式replace,使用trim()函数更简洁方便

let str = ' baa '

let strNew = str.trim()
目录
相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
25天前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
40 13
|
1月前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
28天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
1月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
27天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
1月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
27 4
|
1月前
|
前端开发 JavaScript 关系型数据库
基于 Vue2.0 + Nest.js 全栈开发的后台应用
Vue2 Admin 是一个基于 Vue2 和 Ant Design Pro 开发的前端项目,配合 Nest.js 构建的后端,提供了一个完整的全栈后台应用解决方案。该项目支持动态国际化、用户权限管理、操作日志记录等功能,适合全栈开发者学习参考。线上预览地址:https://vue2.baiwumm.com/,用户名:Admin,密码:abc123456。
|
1月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
40 2