JS常用函数总结归纳

这次给大家带来JS常用函数总结归纳,使用JS常用函数的注意事项有哪些,下面就是实战案例,一起来看一下。

数组扁平化

数组扁平化有很多方法,但最终最好的方法就是递归,实现一个指定深度的扁平化方法,这样基本的套路都会了解。

function flattenDepth(array, depth = 1) { let result = [] array.forEach(item => { let d = depth if (Array.isArray(item) && d > 0) {  result.push(...(flattenDepth(item, --d))) } else {  result.push(item) } }) return result}console.log(flattenDepth([1, [2, [3, [4]], 5]])) // [ 1, 2, [ 3, [ 4 ] ], 5 ]console.log(flattenDepth([1, [2, [3, [4]], 5]], 2)) // [ 1, 2, 3, [ 4 ], 5 ]console.log(flattenDepth([1, [2, [3, [4]], 5]], 3)) // [ 1, 2, 3, 4, 5 ]

登录后复制

递归实现很简洁易懂,就是将每一项遍历,如果某一项为数组,则让该项继续调用,这里指定了 depth 作为扁平化的深度,因为这个参数对数组的每一项都要起作用,故放在循环的里面。

柯里化

函数的柯里化都被讲烂了,每个人都有自己的理解和实现方法,一句话解释就是参数够了就执行,参数不够就返回一个函数,之前的参数存起来,直到够了为止。

function curry(func) { var l = func.length return function curried() { var args = [].slice.call(arguments) if(args.length  [1, 2, 3]curried(1, 2)(3) // => [1, 2, 3]curried(1, 2, 3) // => [1, 2, 3]

登录后复制

上面的代码不难看出,每次判断参数的个数,与被柯里化的函数参数个数比较,如果小于就继续返回函数,否则就执行。

防抖

防抖按照我的理解就是不管你触发多少次,都等到你最后触发后过一段你指定的时间才触发。按照这个解释,写一个基本版的。

function debounce(func, wait) { var timer return function() { var context = this var args = arguments clearTimeout(timer) timer = setTimeout(function() {  func.apply(context, args) }, wait) }}

登录后复制

现在有个要求就是刚开始的时候也触发,最后一次也触发,并且可以配置,先写个测试页面方便测试功能,每次按空格键就会让数字加1,来测试防抖和节流函数。

   #container{text-align: center; color: #333; font-size: 30px;}  

var count = 1 var container = document.getElementById('container') function getUserAction(e) { // 空格 if (e.keyCode === 32) { container.innerHTML = count++ } } // document.onkeydown = debounce(getUserAction, 1000, false, true) document.onkeydown = throttle(getUserAction, 1000, true, true) function debounce(func, wait, leading, trailing) {} function throttle(func, wait, leading, trailing) {}

登录后复制

通过 leading 和 trailing 两个参数来决定开始和结束是否执行,如果 leading 为 true,则没次按空格都会执行一次,如果 trailing 为 true,则每次结束都会将最后一次触发执行。以防抖函数距离,如果两者都为 true,则第一次按空格会加 1,然后快速按空格,此时里面的 getUserAction 并不会执行,而是等到松手后再执行,加入 trailing 为 false,则松手后不会执行。

function debounce(func, wait, leading, trailing) { var timer, lastCall = 0, flag = true return function() { var context = this var args = arguments var now = + new Date() if (now - lastCall < wait) {  flag = false  lastCall = now } else {  flag = true } if (leading && flag) {  lastCall = now  return func.apply(context, args) } if (trailing) {  clearTimeout(timer)  timer = setTimeout(function() {  flag = true  func.apply(context, args)  }, wait) } }}

登录后复制

解释一下,每次记录上次调用的时间,与现在的时间对比,小于间隔的话,第一次执行后之后就不会执行,大于间隔或在间隔时间后调用了,则重置 flag,可以与上面那个基本版的对比着看。

节流

节流就是,不管怎么触发,都是按照指定的间隔来执行,同样给个基本版。

function throttle(func, wait) { var timer return function() { var context = this var args = arguments if (!timer) {  timer = setTimeout(function () {  timer = null  func.apply(context, args)  }, wait) } }}

登录后复制

同样和防抖函数一样加上两个参数,也可使用上面的例子来测试,其实两者的代码很类似。

function throttle(func, wait, leading, trailing) { var timer, lastCall = 0, flag = true return function() { var context = this var args = arguments var now = + new Date() flag = now - lastCall > wait if (leading && flag) {  lastCall = now  return func.apply(context, args) } if (!timer && trailing && !(flag && leading)) {  timer = setTimeout(function () {  timer = null  lastCall = + new Date()  func.apply(context, args)  }, wait) } else {  lastCall = now } }}

登录后复制

对象拷贝

对象拷贝都知道分为深拷贝和浅拷贝,黑科技手段就是使用

JSON.parse(JSON.stringify(obj))

还有个方法就是使用递归了

function clone(value, isDeep) { if (value === null) return null if (typeof value !== 'object') return value if (Array.isArray(value)) { if (isDeep) {  return value.map(item => clone(item, true)) } return [].concat(value) } else { if (isDeep) {  var obj = {}  Object.keys(value).forEach(item => {  obj[item] = clone(value[item], true)  })  return obj } return { ...value } }}var objects = { c: { 'a': 1, e: [1, {f: 2}] }, d: { 'b': 2 } }var shallow = clone(objects, true)console.log(shallow.c.e[1]) // { f: 2 }console.log(shallow.c === objects.c) // falseconsole.log(shallow.d === objects.d) // falseconsole.log(shallow === objects) // false

登录后复制

对于基本类型直接返回,对于引用类型,遍历递归调用 clone 方法。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Vue文档易错点整理

Angular CLI生成路由步骤详解

以上就是JS常用函数总结归纳的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2764785.html

(0)
上一篇 2025年3月8日 10:37:19
下一篇 2025年2月18日 02:58:09

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS原始值与引用值有哪些储存方式

    这次给大家带来JS原始值与引用值有哪些储存方式,使用JS原始值与引用值储存方式的注意事项有哪些,下面就是实战案例,一起来看一下。 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number、Stirng、Boolean、Null…

    2025年3月8日
    200
  • JS动画定时器使用详解

    这次给大家带来JS动画定时器使用详解,JS动画定时器使用的注意事项有哪些,下面就是实战案例,一起来看一下。 广义说:一切通过js改变的视觉呈现都叫动画;例如,按钮,链接等元素交互反馈。 狭义说:通过定时器连续调用js函数进行元素属性改变产生…

    2025年3月8日
    200
  • 毕达哥拉斯树怎样用JS实现

    这次给大家带来毕达哥拉斯树怎样用JS实现,毕达哥拉斯树用JS实现的注意事项有哪些,下面就是实战案例,一起来看一下。 效果如下: 主要方法 translate() rotate() rect() push() pop() map() 主要思想…

    2025年3月8日
    200
  • js-cookie使用步骤详解

    这次给大家带来js-cookie使用步骤详解,js-cookie使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Cookie是网站设计者放置在客户端的小文本文件,一般后台语言使用的比较多,可以实现用户个性化的一些需求。js-cook…

    编程技术 2025年3月8日
    200
  • url、href、src在JS中的使用

    这次给大家带来url、href、src在JS中的使用,url、href、src在JS中使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一、URL的概念 统一资源定位符(或称统一资源定位器/定位地址、URL地址等,英语:Uniform…

    2025年3月8日 编程技术
    200
  • js验证出生日期正则表达式

    这次给大家带来js验证出生日期正则表达式,实现js验证出生日期正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。 简言 在表单验证中,经常会用正则表达式做出生日期校验。本文把出生日期分割成几个部分,分步地介绍了实现一个出生日期校验…

    2025年3月8日
    200
  • Vue.js中computed使用详解

    这次给大家带来Vue.js中computed使用详解,Vue.js中computed使用的注意事项有哪些,下面就是实战案例,一起来看一下。 JS属性: JavaScript有一个特性是 Object.defineProperty ,它能做很…

    编程技术 2025年3月8日
    200
  • JS事件委托使用详解

    这次给大家带来JS事件委托使用详解,JS事件委托使用的注意事项有哪些,下面就是实战案例,一起来看一下。 事件委托(也叫事件代理),其实这个问题也简单,要想弄明白事件委托,我们先要把事件冒泡的机制搞清楚。举个事件冒泡的例子: 点击 var u…

    编程技术 2025年3月8日
    200
  • p5.js实现斐波那契螺旋动画步骤详解

    这次给大家带来p5.js实现斐波那契螺旋动画步骤详解,p5.js实现斐波那契螺旋动画的注意事项有哪些,下面就是实战案例,一起来看一下。 效果如下: 主要方法 translate() rotate() arc() 斐波那契螺旋 斐波那契螺旋线…

    2025年3月8日
    200
  • JS实现摩天轮抽奖

    这次给大家带来JS实现摩天轮抽奖,JS实现摩天轮抽奖的注意事项有哪些,下面就是实战案例,一起来看一下。  效果图: 图片素材 : 代码如下,复制即可使用: 幸运抽奖页面 /*CSS代码*/ *{ padding:0; margin:0; }…

    2025年3月8日
    200

发表回复

登录后才能评论