pop()和shift()均直接修改原数组并使length立即减1:pop()删末尾元素,shift()删开头元素且其余元素索引前移;应避免误用其返回值链式调用。

pop() 和 shift() 都会直接修改原数组,并减少其长度 —— 这是它们最明确的副作用。识别和控制这种副作用,关键在于理解“谁在改、改多少、何时生效”。
副作用的本质:长度立刻减 1
调用 pop() 或 shift() 后,原数组的 length 属性立即更新,且被移除的元素从内存中脱离(若无其他引用)。这不是延迟操作,也不需要手动同步。
- pop() 删除末尾元素 → length 减 1
- shift() 删除开头元素 → length 减 1,且剩余所有元素索引前移一位
如何确认长度是否已被改变
最直接的方式是**在调用前后打印或检查 length**:
let arr = [10, 20, 30]; console.log(arr.length); // 3 arr.pop(); console.log(arr.length); // 2 → 已变
注意:不能依赖返回值判断长度变化 —— pop() 返回的是被删元素(如 30),不是新长度;shift() 同理。只有 push() 和 unshift() 返回新 length。
避免意外副作用的常用做法
如果你只是想“读取”末尾或开头元素,而不改变数组,就不要用 pop()/shift():
- 取末尾值:用 arr[arr.length - 1](不修改)
- 取开头值:用 arr[0](不修改)
- 需要新数组且保留原数组:用 arr.slice(0, -1) 替代 pop(),用 arr.slice(1) 替代 shift()
链式操作中特别容易踩坑的地方
pop() 和 shift() 的返回值是元素本身,不是数组,所以不能直接链式调用 map/filter 等方法:
let arr = [1, 2, 3]; arr.pop().map(x => x * 2); // ❌ 报错:数字没有 map 方法
如果目标是“删掉一个再处理剩下”,必须先执行删除,再对原数组操作,或改用 slice 等无副作用方法生成新数组后再处理。

















