JavaScript中如何将函数参数数组元素复制到本地数组?
首先咱们先理清楚核心需求:把函数参数传入的数组元素完整复制到本地数组,避免出现imgArray[0]为undefined的情况。先给你几个肯定能生效的正确复制方式,再分析你可能踩的坑。
正确的数组复制方法
这些方法都能把elemImg的元素完整复制到新数组imgArray里,不会和原数组共享引用,也不会出现元素丢失的情况:
- 扩展运算符(最简洁)
function imageArrayRandomizer(elemImg) { const imgArray = [...elemImg]; // 之后对imgArray做随机操作就没问题了 console.log(imgArray[0]); // 应该输出"blue" }
- Array.from()方法
function imageArrayRandomizer(elemImg) { const imgArray = Array.from(elemImg); // 后续逻辑 }
- concat()方法
function imageArrayRandomizer(elemImg) { const imgArray = [].concat(elemImg); // 后续逻辑 }
- push.apply()的正确用法
你提到用了apply()但没生效,大概率是写法有问题。正确的写法是:
function imageArrayRandomizer(elemImg) { const imgArray = []; // 把elemImg的元素逐个push到imgArray里 Array.prototype.push.apply(imgArray, elemImg); // 或者更现代的写法:imgArray.push(...elemImg); console.log(imgArray[0]); // 应该输出"blue" }
你可能踩的坑
结合你说的imgArray[0]是undefined但elemImg[0]正常的情况,大概率是以下错误之一:
错误使用splice():如果你的写法是
imgArray.splice(0, elemImg),这完全不对——splice的第二个参数是删除的元素数量,第三个及以后才是要插入的元素。正确的splice复制写法应该是imgArray.splice(0, 0, ...elemImg),但这种写法不如前面几种直观。如果你直接写imgArray = elemImg.splice(0),那会把原数组elemImg的元素全部移除(但你说elemImg[0]还是"blue",所以这个可能性不大)。复制后误修改了数组:比如你复制完之后,不小心执行了
imgArray.shift()或者imgArray.pop(),导致第一个元素被移除,变成undefined。检查一下复制后的代码有没有这类操作。apply()的参数搞反了:比如你写成了
elemImg.push.apply(imgArray, elemImg),这其实也能把元素加到imgArray里,但如果之后你对elemImg做了什么错误操作?不过你说elemImg[0]正常,所以这个可能性也低。
快速验证步骤
你可以在函数里复制完数组后立刻打印两个数组,确认此时imgArray的内容是否正确:
function imageArrayRandomizer(elemImg) { const imgArray = [...elemImg]; console.log("elemImg:", elemImg); // 应该是["blue", ...] console.log("imgArray:", imgArray); // 应该和elemImg完全一致 // 再执行你的随机逻辑 }
如果这时候imgArray已经是undefined,那说明复制方式有问题;如果这时候正常,但之后变成undefined,那问题出在后续的随机代码里。
内容的提问来源于stack exchange,提问作者Pete

