JS 数组操作怪癖

2025-06-09

JS 数组操作怪癖

我在上一篇文章中提到过,我一直在练习手写答案来解决问题。这比使用 IDE 或 Cargo 编程要花费的时间长得多,但也揭示了我对 JS 方法的很多误解:

slice()1splice()

.slice()将数组项提取[0, n-1]为新数组。
.splice()通过从位置删除项[0, n]并将其返回到初始数组的位置来改变原始数组。它还提供了第三个参数来添加项。

这里和这里从函数式编程的角度对此进行了更详细的解释

2 不能简单地遍历字符串

应用.split('')空字符串或[...](扩展运算符)返回离散字母数组

charAt()例外:在 for 循环中使用

说得好!不过,你可以直接用 for 循环遍历字符串,访问每个索引处的字符!

function forEachChar(str, cb) {
   for (let i = 0; i < str.length; i++) {
      cb(str.charAt(i))
   }
}
Enter fullscreen mode Exit fullscreen mode

3 扩展运算符产生浅拷贝

如果要复制的数组深度超过一层,则不应[...spread]。在浅复制中,嵌套数组(或对象)保留对原始副本的引用。对它们的任何更改都会影响初始副本和后续副本。

劳里·巴斯 (Laurie Barth)更详细地介绍了浅层复制和深层复制

4for (i of ...)for (i in ...)

前者支持对数组、字符串、DOM 节点集合、映射、集合和生成器进行迭代。后者则迭代对象属性,例如键。for ...of 与 for...in

5.join().push()对比.concat()

.push() 改变数组并将项添加到长度的末尾
.concat() 合并数组,并且运行速度比 .join() 更快

6 我最喜欢的一些方法存在问题:它们会改变数组

IE shift()unshift()splice()pop()push()

现在,寻找不改变状态的替代方案已经成为我的爱好,例如reduce() filter()map()some()concat()

7find()filter()

find()返回集合中匹配的第一个值并停止,除非我将其放入 for 循环中。filter()返回匹配值的数组。

8 forEach 是一个 void 函数

我读 MDN 文档的时候不太明白,而且博客上似乎有两处说法,说它会改变原始数组。它什么也没返回,在 DEV 社区 ❤️ 的帮助下,我终于发现了这一点!

相关阅读


你还发现了其他想添加到这个列表的人吗?告诉我!

鏂囩珷鏉ユ簮锛�https://dev.to/jenc/js-array-manipulation-quirks-3860
PREV
我从没有规划 Web 应用的经验(从头到尾) 前端与后端是分离的。先搞定基本功能。一次调试一个。我无法遵循自己的冲刺计划。设计 API 时,要考虑逻辑的视觉效果。在开始计划的这一部分之前,确定你的工具,并阅读其文档。不要浪费时间学习新框架。始终在本地进行测试。付费体验很差,但保持一致性或许值得。给自己足够的时间去尝试。在申请工作之前,确保你的项目和作品集万无一失。
NEXT
第一印象:在学习 React/Redux 之后学习 Angular