JavaScript数组如何创建_常用数组方法有哪些【教程】

5次阅读

推荐使用字面量[]创建数组,如const arr = [1, 2, 3];new Array(5)创建空数组而非含5个undefined的数组,Array.from()或展开运算符更安全替代slice.call();push/pop/shift/unshift/splice/sort/reverse会改变原数组;Filter返回满足条件的新数组,map返回等长新数组,find返回首个匹配项;includes()能正确识别NaN,indexOf()不能。

JavaScript数组如何创建_常用数组方法有哪些【教程】

javaScript数组创建很简单,但不同方式会影响后续操作的灵活性;常用方法里有些会改原数组、有些不会,用错容易引发隐蔽 bug

怎么创建数组才不容易踩坑

创建数组有字面量、构造函数两种主流方式,但构造函数在传单个数字时行为反直觉:

  • [] 最安全,推荐日常使用,比如 const arr = [1, 2, 3]
  • new Array(5) 不是创建含 5 个 undefined 的数组,而是创建长度为 5 的空数组(arr[0]undefined,但 arr.hasOwnProperty(0)false
  • new Array(1, 2, 3) 才等价于 [1, 2, 3],参数个数决定行为,容易误判
  • 从类数组对象转数组,别直接用 Array.prototype.slice.call()(已过时),改用 Array.from() 或展开运算符 [...arguments]

哪些数组方法会改变原数组

这类方法执行后原数组内容就变了,如果数据被多处引用,可能引发意料外的状态污染:

  • push()pop()shift()unshift():增删首尾元素
  • splice():万能修改,可删、可插、可替,第一个参数是起始索引,第二个是删除个数,之后全是插入项
  • sort():默认按字符串 Unicode 码点排序,[10, 2, 30].sort() 得到 [10, 2, 30] 而不是 [2, 10, 30],务必传比较函数:(a, b) => a - b
  • reverse():反转,不返回新数组

filter/map/find 之间到底怎么选

这三个都遍历、都不改原数组,但语义和返回值完全不同,混用会导致逻辑错误:

立即学习Java免费学习笔记(深入)”;

  • filter() 返回满足条件的**新数组**,长度 ≤ 原数组,例如 [1,2,3].filter(x => x > 1)[2, 3]
  • map() 返回**等长新数组**,每个元素是回调返回值,哪怕返回 undefined 也会占位
  • find() 只返回**第一个匹配项**(或 undefined),不是数组,适合“找一个就停”的场景;要找所有匹配项,必须用 filter()
  • 注意 findIndex()indexOf() 区别:前者支持函数判断,后者只支持严格相等

includes() 和 indexOf() 判定 NaN 的差异

这是容易被忽略的兼容性细节:es6includes() 能正确识别 NaN,而 indexOf() 不能:

const arr = [1, NaN, 3]; arr.indexOf(NaN);    // -1(错误!) arr.includes(NaN);   // true(正确)

includes() 内部用的是 SameValueZero 比较算法,对 NaN0 的处理更符合直觉;但要注意它不支持回调函数,只能做值匹配。

text=ZqhQzanResources