[前端笔记016]JavaScript之数组、深浅拷贝、数组的破坏性方法、高级函数与闭包

资源

数组基础知识

  • 数组是复合数据类型,在数组中可以存储多个不同类型的数据,存储的数据叫元素
  • 创建方式 const arr=new Array(); const arr=[1,2,3,4];推荐后者
  • 对于数组非连续位置赋值会使非连续位置出现空属性的情况
  • 读取未定义位置的值,不会报错,会输出undefined
  • type of 返回 object
  • 获取数组长度,arr.length,实际值为最大索引+1;因此可以使用arr[arr.length]向数组最后添加元素。
  • 数组的length是可以手动改的,当大于实际长度时,会创建空属性;小于实际长度时,会裁掉后面的。
  • 有for of的写法:for(let 变量 of 可迭代的对象 ){。。。。}
  • 常用的非破坏方法,Array.isArray(),at()根据索引找元素可负值,concat()连接数组生成新数组
  • indexOf(),获取元素在数组中第一次出现的索引,找不到返回-1
  • lastIndexOf(),找最后一次出现的索引,找不到返回-1
  • 两者的参数,一是要查询的元素,二是查询的起始位置
  • join(),将数组中的元素连接为字符串,连接符由参数指定,默认逗号
  • slice(起始位置,结束位置+1),用来截取数组,类似python的切片;如果两个参数全部省略,则对数组进行浅拷贝

对象的复制

  • 通过赋值的复制不是复制,因为指向了同一个对象。要复制一个对象必须要产生新的对象。
  • 调用slice时,会产生新的数组对象,从而完成对数组的复制,
  • 浅拷贝只会复制对象本身,不会复制对象中的属性和元素,对对象中的对象的元素进行修改时会影响到其他对象;通常对对象的复制都是浅拷贝比如slice ,当存储值为原始值时,深浅拷贝无区别;
  • 深拷贝不仅会复制对象本身,还会复制对象中的属性和元素,通常不会使用深拷贝,占用性能;常用的深拷贝方法为,structuredClone(对象)。
  • 一些复制的方式:
  • 展开运算符...,可以将一个数组中的元素展开到另一个数组中或者作为函数的参数传递,例const arr2=['还可以自己加元素',...arr1,'1'],以此完成浅复制。也可以完成对对象属性的复制。
  • Object.assign(目标对象,被复制的对象),将被复制对象中的属性复制到目标对象中,并将对象返回,补全没有的,重复的覆盖。 浅复制。

数组的破坏性方法

  • push(),添加一个或多个元素,并返回数组长度。
  • pop(),删除并返回数组的最后一个元素。
  • unshift(),向数组开头添加一个或多个元素,并返回数组长度。
  • shift(),删除并返回数组的第一个元素。
  • splice(),可以删除、插入和替换数组中的元素,参数,splice(删除的起始位置,删除的数量,要添加的元素),删除数量为0时是插入,其他是替换;返回被删除的元素。
  • reverse(),反转数组
  • sort(),对原数组排序,破坏原数组;默认会将数组按unicode升序排列,所以直接排序有出现不正确的结果,可以传递回调函数来指定排序规则。参数例子有,(a,b)=>a-b升序排列;(a,b)=>b-a降序排列;
  • forEach(),遍历数组,需要回调函数作为参数,该回调函数会被调用元素数量的次数,每次调用都会将数组中的数据作为参数传递。固定写法,forEach((element,index,array)=>{}),element会获取到数组中的每一个参数,index获取索引,array是整个数组。三个参数的名字随便起,但位置代表的信息不变。看起来不是破坏性的。
  • filter(),将数组中符合条件的元素保存到一个新数组并返回。需要回调函数作为参数,为每一个元素调用回调函数,并根据返回值判断是否把元素添加到新数组。同样有element,index,array,在回调函数中写过滤语句。非破坏。
  • map(),根据当前数组生成一个新数组并返回,也需要回调函数,回调函数的返回值会成为新数组的元素。该回调函数会被调用元素数量的次数。非破坏。
  • reduce(),将一个数组中的所有元素合为一个值,回调函数作为参数表示合并规则;例:(a,b)=>{a+b,10},表示求和,a表示前一次的结果,b表示下一个元素。10表示初始值,第一运算没有初始值就是a=第一个与b=第二个运算,有初始值就是a=初始值和b=第一个运算

高级函数与闭包

  • 一个函数的参数也可以是函数,如果将函数作为参数传递,那么我们就称这个函数为回调函数(callback),在函数中调用函数,以函数的返回值作为判断条件
  • 通常回调函数为匿名函数,一般使用箭头函数,如一个参数的箭头函数 a=> a.age>18
  • 如果一个函数的参数或者返回值是函数,则这个函数称为高阶函数;意味着可以动态地传递代码
  • 可以通过高阶函数,函数作为返回值,动态的生成一个新的函数,这样即没有修改原函数,又增加了新的功能。
  • 闭包:闭包为能访问到外部函数作用域中变量的函数,在需要隐藏不希望被别人访问的内容时,可以使用闭包;闭包构成的条件:1.函数的嵌套;2.内部函数要引用外部函数中的变量;3.内部函数要作为返回值返回。利用闭包函数作为返回值,利用函数作用域,在函数的上一层函数中来隐藏不希望被外部访问到的变量。
  • 闭包的原理:函数的作用域在函数创建时就已经确定(词法作用域)。
  • 闭包的生命周期:1.闭包在外部函数调用时产生,外部函数每次调用都会产生一个全新的闭包,所以会又重复内容,浪费空间,不适用于大多次的创建。2.在内部函数丢失时销毁,即无变量指向内部函数(被垃圾回收)时。
  • 需要执行次数少时,使用闭包;需要大量创建实例时,使用类。优先使用闭包,避免this
  • 递归分为 基线条件(何时终止)和递归条件(如何拆分问题)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值