测试自定义数组原型方法yarra是否实现原地反转数组
你的
yarra方法实现完全正确! 先给你吃个定心丸:你写的这个数组原型方法完美实现了原地反转数组的需求,并且返回值的行为也和原生Array.prototype.reverse()保持一致。
为什么它是正确的?
- 原地操作的核心逻辑没问题:
你用了经典的双指针思路,左指针从数组头部(left=0)、右指针从数组尾部(right=this.length-1)开始,每次交换两个指针指向的元素,然后向中间移动指针,直到左指针超过右指针时停止。整个过程没有创建新数组,所有修改都直接作用在原数组本身,完全符合「原地反转」的要求。 - 元素交换的写法高效且正确:
用ES6解构赋值[this[left], this[right]] = [this[right], this[left]]来交换元素,既简洁又不需要额外的临时变量,是现代JS里很优雅的写法,逻辑上没有任何问题。 - 返回值符合预期:
方法最后返回this,这和原生reverse()的行为完全一致——原生方法也是原地反转后返回原数组的引用,而不是返回一个新数组。
补充一个完整的测试用例验证
你可以把测试代码补全来进一步确认:
// 你的yarra方法 Array.prototype.yarra = function () { for (let left=0, right=this.length-1; left<right; left++, right--) { [this[left], this[right]] = [this[right], this[left]] } return this }; // 测试代码 describe('yarra', function () { it('should reverse an array in place and return the original array reference', function() { const testArr = [1, 2, 3, 4, 5]; const result = testArr.yarra(); // 验证数组内容被反转 expect(testArr).toEqual([5, 4, 3, 2, 1]); // 验证返回的是原数组引用 expect(result).toBe(testArr); // 验证空数组也能正常处理 expect([].yarra()).toEqual([]); // 验证单元素数组无变化 expect([10].yarra()).toEqual([10]); }); });
这些测试用例都能通过,进一步证明你的实现是正确的。
小提醒(仅作为学习延伸)
作为学习练习,给数组原型扩展方法完全没问题,但在实际项目中,直接扩展原生原型可能会带来命名冲突等问题。如果要在项目里做类似的扩展,建议用Symbol来定义方法名,避免和其他代码冲突~
内容的提问来源于stack exchange,提问作者OctaviaLo
相关产品推荐
相关产品推荐

