JavaScript中return语句工作原理及数组操作代码运行差异疑问
JavaScript return语句与splice方法行为差异解答
核心原因:Array.splice()的返回值特性
splice是JavaScript数组的内置修改方法,执行后返回的是被删除元素组成的新数组,而非修改后的原数组本身。
错误代码问题拆解
你提供的第一段代码直接返回了splice的执行结果:
function removeSmallest(numbers) { var min = Math.min(...numbers); return numbers.splice(numbers.indexOf(min), 1); }
举个例子:如果传入数组为[2, 1, 3, 4],splice删除最小元素1之后,返回值是[1],所以调用函数拿到的结果是被删掉的最小元素数组,自然不符合「移除最小元素后返回剩余数组」的需求。
正确代码逻辑说明
第二段代码先执行splice修改原数组,再返回修改后的原数组:
function removeSmallest(numbers) { var min = Math.min(...numbers); numbers.splice(numbers.indexOf(min), 1); return numbers; }
splice本身会直接修改调用它的原数组,执行完删除操作后,原数组已经变成了移除最小元素的状态,此时再return原数组,返回的就是预期结果。
return语句的运行逻辑补充
JavaScript中return的行为非常直接:函数执行到return时,会立刻终止函数执行,将return后紧跟的表达式的计算值,作为函数的返回值返回给调用方,不会做任何隐式转换,你写的返回值是什么,调用方就拿到什么。
额外注意:splice会直接修改传入的原始数组,如果不想污染外部传入的原数组,可以先做浅拷贝再操作:
function removeSmallest(numbers) { const numbersCopy = [...numbers] const min = Math.min(...numbersCopy); numbersCopy.splice(numbersCopy.indexOf(min), 1); return numbersCopy; }
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

