JavaScript中会改变原数组的方法有6个:push、pop、shift、unshift、splice、sort,reverse也属于变异方法;filter、map等不会修改原数组,始终返回新数组。

哪些数组方法会改变原数组
JavaScript 中有明确的「变异(mutating)」和「非变异(non-mutating)」之分。直接修改原数组的方法只有 6 个:push、pop、shift、unshift、splice、sort(注意:reverse 也属于这一类,但常被忽略)。
常见误用是以为 filter 或 map 会改原数组——它们不会,永远返回新数组。如果你写了 arr.map(x => x * 2) 却发现 arr 没变,不是 bug,是设计如此。
-
splice是唯一能任意增删改的变异方法,但参数顺序反直觉:起始索引、删除个数、插入项…漏掉第二个参数会导致清空后面所有元素 -
sort默认按字符串 Unicode 排序,[10, 2, 30].sort()得到[10, 2, 30]而不是[2, 10, 30],必须传(a, b) => a - b -
push和unshift返回的是新长度,不是数组本身;别写成arr = arr.push(x),这会让arr变成数字
如何安全地复制或切片数组
浅拷贝数组最常用且可靠的方式是展开运算符:[...arr]。它比 arr.slice() 或 Array.from(arr) 更直观,也兼容稀疏数组(虽然实际中很少见)。
但要注意:展开只做一层浅拷贝。如果数组里有对象,复制后两个数组里的对象引用仍指向同一内存地址。
立即学习“Java免费学习笔记(深入)”;
- 需要深拷贝时,
JSON.parse(JSON.stringify(arr))快速但有缺陷:丢失函数、undefined、Date、RegExp等类型 -
slice(0)在旧代码里常见,但语义不如展开清晰;slice()不传参等价于slice(0) -
Array.from(arr)适合需要映射的场景,比如Array.from(arr, x => x * 2),一步完成复制+转换
查找与判断该用 find 还是 includes
find 返回第一个匹配的**元素值**,includes 返回布尔值。选哪个取决于你后续要做什么。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
例如查一个用户对象是否存在:users.find(u => u.id === 123) 能拿到完整对象;而 users.map(u => u.id).includes(123) 多此一举——既浪费遍历,又额外生成 ID 数组。
-
some和every适合条件判断:arr.some(x => typeof x === 'string')比includes更灵活 -
indexOf返回索引,但不支持回调函数;findIndex才是它的现代替代 - 对基本类型用
includes安全;但对对象比较,includes基于引用相等,find配合自定义逻辑才有效
性能敏感场景下慎用哪些方法
在循环内频繁调用 push 是安全的,V8 引擎已对此优化。但反复用 concat 或展开多个大数组拼接,会产生大量中间数组,GC 压力明显。
reduce 功能强大,但可读性容易下降;若只是求和或拼接字符串,for 循环或 join 更直接。
-
flat默认只扁平化一层,深层嵌套需传Infinity,但可能触发栈溢出;递归实现更可控 -
map+filter组合会遍历两次数组;如需同时过滤和转换,优先用reduce或单次for - 大量数据下,
forEach无法中途跳出(break无效),用for或some/find更合适
实际项目里最容易被忽略的,是方法链式调用时的「隐式类型转换」——比如 arr.map(...).filter(...).join(''),一旦某步返回 undefined 或 null,join 会把它们转成字符串 "undefined",而不是报错。










