请用 JavaScript 手写一个与原生数组 push 行为一致的实现,要求给出完整代码,并说明实现要点。
考察说明
考查对 JavaScript 数组原生方法 push 的底层行为理解及动手实现能力。
回答思路
- 【回答框架 1】push 方法的核心行为是在数组末尾追加一个或多个元素,并返回新数组的长度。实现时需先确定 this 指向,通常默认指向数组实例,但通过 call 或 apply 也可作用于类数组对象。
- 【回答框架 2】具体实现步骤:先获取当前数组的 length 属性值,记为 len;然后遍历传入的所有参数,逐个赋值到 this[len + i] 的位置;最后更新 this.length 为 len + 参数个数,并返回新的长度。
- 【回答框架 3】代码演示:Array.prototype.myPush = function() { var len = this.length >>> 0; for (var i = 0; i < arguments.length; i++) { this[len + i] = arguments[i]; } this.length = len + arguments.length; return this.length; }; 其中无符号右移 0 用于将 length 转为非负整数,避免异常。
- 【回答框架 4】边界情况需要处理:当 this 为 null 或 undefined 时应报错;若目标对象 length 属性不是数字,则先转为整数;push 操作会触发数组索引更新,且 length 会自动更新,无需手动处理稀疏数组的空位。
- 【回答框架 5】在 V8 等引擎中,push 可能被优化为快速路径,但手写实现只需保证语义一致,性能不作为主要考虑;最终可用一个测试用例验证结果与原生 push 等效。
- 【关键点 1】push 是修改原数组并返回新长度的方法。
- 【关键点 2】实现时先读取当前 length,再赋值新元素,最后更新 length。
- 【关键点 3】支持多参数追加,通过 arguments 对象遍历参数。
- 【关键点 4】对 this 做类型检查,length 需转为非负整数。
- 【关键点 5】测试时对比原生 push,确保返回值和数组内容一致。
- 【易错点 1】不要忘记更新 length,否则后续操作可能出错;也不要直接 push 到 length 属性而不赋值元素。
- 【易错点 2】忽略参数个数或只处理单个参数会导致多参数调用结果错误。
- 【易错点 3】未处理 this 为 null/undefined 时会抛错,但在严格模式与普通模式行为不同,需注意兼容。