一、基础行为与返回值
返回值与数组长度的变化
在 JavaScript 中,Array.prototype.pop() 方法会从数组末尾移除一个元素并返回该值,若数组为空则返回 undefined。
调用 pop()不仅改变数组的内容,还直接影响其 length 属性,通常会将 length 减 1。
对于包含引用类型元素的数组,返回的被移除元素 是对该对象的引用;若不存在其他引用指向该对象,该对象将进入垃圾回收的候选状态。

let nums = [10, 20, 30];
let last = nums.pop();
console.log(nums); // [10, 20]
console.log(last); // 30
二、数组修改机制的底层原理
尾部删除的实现要点
从机制角度看,pop 通过读取数组的最后一个索引的值并将 length 属性设为 len - 1,来实现对尾部的删除。
这意味着原来索引 len - 1 的元素会被从数组中移除,随后该位置不再具有有效的元素引用,从而影响后续的遍历与迭代行为。
如果该元素是一个对象引用,该对象可能仍被其他变量持有,因此不会立即被垃圾回收,直到所有引用都消失。
const arr = [1, {a: 1}, 3];
const popped = arr.pop();
console.log(arr); // [1, {a: 1}]
console.log(popped); // {a: 1}
三、引用类型行为与内存管理
对象元素的引用与垃圾回收的关系
当数组元素是引用类型时,pop 仍然返回该引用对象,注意数组本身的引用在删除后可能释放。
如果没有其他引用指向该对象,它将成为垃圾回收的候选对象,但在 GC 执行前仍可能在内存中存在一段时间。
另一方面,如果你保留了对该对象的独立引用(例如变量指向对象),那么对象不会被回收,直到最后一个引用消失。
let a = [{id:1}, {id:2}];
let last = a.pop();
console.log(a); // [{id:1}]
console.log(last); // {id:2}
四、与其他方法比较与常见误解
与 shift、splice 的对比
pop 只移除数组末尾的一个元素,shift 从开头移除,splice 则可以在任意位置进行删除、插入或替换。
在性能方面,尾部操作通常比前部操作更高效,因为 JS 引擎在处理长度变化时的成本更低。
const arr = [0, 1, 2, 3, 4];
const last = arr.pop(); // 尾部删除
const first = arr.shift(); // 开头删除
arr.splice(1, 1); // 删除索引 1 的元素


