1687 字
8 分钟
JavaScript-高级引用类型

Object#

创建方式:#

new Object() let obj={ }

赋值方式:#

存取方式:#

  • 点语法obj.属性
  • 中括号obj[属性]

Array#

创建方式:#

new Array() Array() let arr=[ ]

Array.from()#

将类数组结构转换为数组

Array.from("Matt")
//["M","a","t","t"]
Array.of()#

将一组参数转换为数组实例

数组空位:#

  • 使用数组字面量初始化数组时,可以使用一串逗号创建空位
    • const a = [1,,,,,5];
  • map()会跳过空位置
  • join()会视空位置为空字符串

数组索引:#

  • 用数组索引更新数组时,中间跳过的部分会为 undefined
let a = [1];
a[100]=1;
//索引1到99的部分为undefined

检测数组:#

  • 假定只有一个全局执行上下文instanceof()
  • 如果要把数组从一个框架传给另外一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组Array.isArray()

迭代器方法:#

  • keys():返回数组索引
  • values():返回数组元素
  • entires():返回索引/值对

复制和填充方法:#

  • fill()
    • 向一个已有的数组中插入全部或部分相同的值
    • 参数:填入数字(必填)、开始索引(可选)、结束索引(可选)
    • 索引为负数也就是想象成数组产固定加上它得到的正索引
    • 静默沪铝超出数组边界、0 长度、方向相仿的索引范围
  • copyWithin()
    • 按照指定范围复制数组中的部分内容,然后将它插入到指定索引开始的位置
    • 参数:插入开始位置、开始复制位置、结束复制位置(没有则到末尾)
    • 索引问题同fill()

扩展操作符:#

...

  • 将两个或多个数组合并[...array1,...array2]
  • 创建数组浅拷贝let copyarr = [...originalArray]

剩余操作符:#

  • 主要用于函数参数或解构赋值

转换方法:#

  • toLocalString()
  • toString():返回数组中每一个值的等效字符串拼接而成的一个逗号分隔的字符串,也就是对数组中每个值都调用其toString()方法
  • valueOf():返回数组本身
  • toLocalString()toString()返回的都是逗号分隔的字符串,可以使用join()方法接收一个字符串分隔符
  • 数组中的某一项为 null 和 undefined 时,在join()``toLocalString()``toString()``valueOf()返回的结果会以空字符串存在

栈方法:#

push():尾入 pop():尾出

队列方法:#

shift():头出

反转和排序方法:#

  • 反转reverse()
  • 排序sort()
    • 会在每一项调用toString()转型函数,然后比较字符串比较顺序
    • 可以接收一个比较函数arr.sort(比较函数)
    • 常见排序模式(141 页)
      • arr.sort((a,b)=> a-b ) 数值升序
      • arr.sort((a,b)=> b-a ) 数值降序
      • arr.sort((a,b)=> a.localeCompare(b) ) 字符串升序
      • arr.sort((a,b)=> b.localeCompare(a) ) 字符串降序

操作方法:#

  • concat()
    • 在现有数组全部元素基础上常见一个新数组,arr.concat("元素1",["元素2"]),这样会吧其中的所有元素都插入到 arr 数组中,且可以打平数组
    • 打平数组参数可以重写newArray[Sysbol.isConcatSpreadable] = false,这样可以强制不打平数组
  • slice()
    • 创建一个包含原有数组中一个或多个元素的新数组,let new = old.slice(1,3)为将 old 数组中索引 1-3 传入新创建的 new 数组
    • 参数:返回元素的开始索引、结束索引(没有则返回到末尾)
  • splice()
    • 删除
    • 参数:要删除的第一个元素的位置、要删除的元素数量
  • splice()
    • 插入、替换
    • 参数:开始位置、要删除的元素数量、要插入的元素(插入的元素可以一直写多个,直接接上就好)
    • 返回一个从数组中删除的元素

搜索和位置方法:#

  • indexOf() lastIndexOf() includes()
    • 其中前两个返回的是查找的元素的位置,没有则返回-1;区别:一个从头开始找,一个从末尾开始
    • 后面的一个返回的是布尔值
  • find() findIndex()
    • 允许使用断言函数搜索数组
      • 参数:元素、索引、数组本身

迭代方法:#

  • every()
    • 如果每一项都返回 true,才返回 true
  • some()
    • 如果有一项返回 true,则返回 true
  • filter()
    • 返回 true 的向会组成数组之后返回
    • 适合用于查询数组中符合条件的所有元素
  • forEach()
    • 没有返回值
  • map()
    • 返回由每一次函数调用的结果构成的数组
    • 适合用于创建与原数组一一对应新数组

归并方法:#

reduce() reduceRight()

  • 参数:上一个归并值、当前项、当前项的索引值和数组本身;这个函数返回的任何值都会作为下一次调用同一个函数的第一个参数;如果没有第二个参数(作为归并起点值),则第一次迭代将从数组第二项开始;第一参数为数组第一项,第二参数为数组第二项

展开方法:#

flat() flatMap()

  • flat()支持接收一个深度参数(默认为 1),并返回一个将数组实例展开到指定深度的浅拷贝
  • flatMap()会先在展开数组前执行映射,其他无区别,只是提高效率,因为浏览器只执行一次遍历
  • flatMap()适合处理非数组对象的方法(如split())返回的数组

Map#

创建方式:#

  • new Map()
  • 使用自定义迭代对象初始化映射
const m = new Map(
{
[Symbol.iterator]:function#(){
yield ["key1","val1"];
}
}
)
  • set()添加键值对
  • Map 可以使用 JS 任何数据类型作为键

顺序与迭代:#

  • Map 实例会维护键值对的插入顺序,因此可以通过根据插入顺序进行迭代操作
  • map 提供一个迭代器可以通过entries()Symbol.iterator属性获得

Map 和 Object:#

  • 删除性能:对大多数引擎来书,Map 的删除操作都会更快

插入:迭代#

迭代协议:#

JS 中,任何实现了[Symbol.iterator]()方法的对象都是可迭代的,当对象被用于for...of或者扩展操作符是,JS 会自动调用这个方法 可以通过实现[Symbol.iterator]()使对象可迭代

const obj = {
...,
[Symbol.iterator](){
let index = 0;
const keys = Object.keys(this);
return {
next:()=>{
value:this[keys[index]];
done:index>keys.length;
}
}
}
}
扩展操作符原理:#
  • 检查对象是否实现了[Symbol.iterator]()
  • 如果实现了则调用该方法获取迭代器
  • 依次从迭代器中取出值并展开

Set#

创建方式:#

  • new Set()
  • 使用自定义迭代对象初始化
  • add()增加值;has()查询;size()获取数量;delete()clear()删除元素
  • 自动去重

顺序与迭代:#

  • set 提供了一个能够以插入顺序生成集合内容的迭代器,**通过values()方法及其别名方法keys()或者[Symbol.iterator]()**取得

弱引用#

希望保持对某个对象的引用,但是又不阻止它被当作垃圾回收

JavaScript-高级引用类型
https://linrunxinnn.cn/posts/高级引用类型/
作者
linrunxinnn
发布于
2025-05-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时