16个必备的JavaScript代码片段

这个方法的实现也是从Lodash库中copy的

/**

* 节流,多次触发,间隔时间段执行

* @param {Function} func

* @param {Int} wait

* @param {Object} options

*/

export function throttle(func, wait=500, options) {

//container.onmousemove = throttle(getUserAction, 1000);

var timeout, context, args

var previous = 0

if (!options) options = {leading:false,trailing:true}

var later = function() {

previous = options.leading === false ? 0 : new Date().getTime()

timeout = null

func.apply(context, args)

if (!timeout) context = args = null

}

var throttled = function() {

var now = new Date().getTime()

if (!previous && options.leading === false) previous = now

var remaining = wait - (now - previous)

context = this

args = arguments

if (remaining <= 0 || remaining > wait) {

if (timeout) {

clearTimeout(timeout)

timeout = null

}

previous = now

func.apply(context, args)

if (!timeout) context = args = null

} else if (!timeout && options.trailing !== false) {

timeout = setTimeout(later, remaining)

}

}

return throttled

}

第三个参数还有点复杂,options

  • leading,函数在每个等待时延的开始被调用,默认值为false

  • trailing,函数在每个等待时延的结束被调用,默认值是true

可以根据不同的值来设置不同的效果:

  • leading-false,trailing-true:默认情况,即在延时结束后才会调用函数

  • leading-true,trailing-true:在延时开始时就调用,延时结束后也会调用

  • leading-true, trailing-false:只在延时开始时调用

例子:

Document  

8. cleanObject


去除对象中value为空(null,undefined,‘’)的属性,举个栗子:

let res=cleanObject({

name:‘’,

pageSize:10,

page:1

})

console.log(“res”, res) //输入{page:1,pageSize:10}   name为空字符串,属性删掉

使用场景是:后端列表查询接口,某个字段前端不传,后端就不根据那个字段筛选,例如name不传的话,就只根据pagepageSize筛选,但是前端查询参数的时候(vue或者react)中,往往会这样定义

export default{

data(){

return {

query:{

name:‘’,

pageSize:10,

page:1

}

}

}

}

const [query,setQuery]=useState({name:‘’,page:1,pageSize:10})

给后端发送数据的时候,要判断某个属性是不是空字符串,然后给后端拼参数,这块逻辑抽离出来就是cleanObject,代码实现如下

export const isFalsy = (value) => (value === 0 ? false : !value);

export const isVoid = (value) =>

value === undefined || value === null || value === “”;

export const cleanObject = (object) => {

// Object.assign({}, object)

if (!object) {

return {};

}

const result = { …object };

Object.keys(result).forEach((key) => {

const value = result[key];

if (isVoid(value)) {

delete result[key];

}

});

return result;

};

let res=cleanObject({

name:‘’,

pageSize:10,

page:1

})

console.log(“res”, res) //输入{page:1,pageSize:10}

剩下的8个在这里:

1. 获取文件后缀名


使用场景:上传文件判断后缀名

/**

* 获取文件后缀名

* @param {String} filename

*/

export function getExt(filename) {

if (typeof filename == ‘string’) {

return filename

.split(‘.’)

.pop()

.toLowerCase()

} else {

throw new Error(‘filename must be a string type’)

}

}

使用方式

getExt(“1.mp4”) //->mp4

2. 复制内容到剪贴板


export function copyToBoard(value) {

const element = document.createElement(‘textarea’)

document.body.appendChild(element)

element.value = value

element.select()

if (document.execCommand(‘copy’)) {

document.execCommand(‘copy’)

document.body.removeChild(element)

return true

}

document.body.removeChild(element)

return false

}

使用方式:

//如果复制成功返回true

copyToBoard(‘lalallala’)

原理:

  1. 创建一个textare元素并调用select()方法选中

  2. document.execCommand(‘copy’)方法,拷贝当前选中内容到剪贴板。

3. 休眠多少毫秒


/**

* 休眠xxxms

* @param {Number} milliseconds

*/

export function sleep(ms) {

return new Promise(resolve => setTimeout(resolve, ms))

}

//使用方式

const fetchData=async()=>{

await sleep(1000)

}

4. 生成随机字符串


/**

* 生成随机id

* @param {*} length

* @param {*} chars

*/

export function uuid(length, chars) {

chars =

chars ||

‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’

length = length || 8

var result = ‘’

for (var i = length; i > 0; --i)

result += chars[Math.floor(Math.random() * chars.length)]

return result

}

使用方式

//第一个参数指定位数,第二个字符串指定字符,都是可选参数,如果都不传,默认生成8位

uuid()

使用场景:用于前端生成随机的ID,毕竟现在的Vue和React都需要绑定key

5. 简单的深拷贝


/**

*深拷贝

* @export

* @param {*} obj

* @returns

*/

export function deepCopy(obj) {

if (typeof obj != ‘object’) {

return obj

}

if (obj == null) {

return obj

}

return JSON.parse(JSON.stringify(obj))

}

缺陷:只拷贝对象、数组以及对象数组,对于大部分场景已经足够

const person={name:‘xiaoming’,child:{name:‘Jack’}}

deepCopy(person) //new person

6. 数组去重


/**

* 数组去重

* @param {*} arr

*/

export function uniqueArray(arr) {

if (!Array.isArray(arr)) {

throw new Error(‘The first parameter must be an array’)

}

if (arr.length == 1) {

return arr

}

return […new Set(arr)]

}

原理是利用Set中不能出现重复元素的特性

uniqueArray([1,1,1,1,1])//[1]

7. 对象转化为FormData对象


/**

* 对象转化为formdata

* @param {Object} object

*/

export function getFormData(object) {

const formData = new FormData()

Object.keys(object).forEach(key => {

const value = object[key]

if (Array.isArray(value)) {

value.forEach((subValue, i) =>

formData.append(key + [${i}], subValue)

)

} else {

formData.append(key, object[key])

}

})

return formData

}

使用场景:上传文件时我们要新建一个FormData对象,然后有多少个参数就append多少次,使用该函数可以简化逻辑使用方式:

let req={

file:xxx,

userId:1,

phone:‘15198763636’,

//…

}

fetch(getFormData(req))

8.保留到小数点以后n位


// 保留小数点以后几位,默认2位

export function cutNumber(number, no = 2) {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

}

fetch(getFormData(req))

8.保留到小数点以后n位


// 保留小数点以后几位,默认2位

export function cutNumber(number, no = 2) {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-w6zcvDag-1715281443311)]

[外链图片转存中…(img-VX6fpfIn-1715281443312)]

[外链图片转存中…(img-4qUFJIpx-1715281443312)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值