能否使用eval动态构建字符串生成指定长度m的子数组数组?
能否用eval动态构建字符串生成子数组组成的数组?
能,但你的写法存在错误,而且完全没必要用eval——它不仅容易引发bug,还存在安全风险、性能也差。
你的代码为什么失败?
当你执行eval(correct_m_subarray_String)时,eval处理的是逗号表达式(比如a[i],a[i+1],a[i+2],a[i+3]),逗号表达式只会返回最后一个子表达式的结果,也就是a[i+3]。所以你实际push的是[a[i+3]],自然不是长度为m的子数组。
推荐的正确写法(不用eval)
直接用数组原生方法或手动循环,简单高效又安全:
方法1:用slice(最简洁)
如果要从originalArray的索引i开始,截取长度为m的子数组,一行代码搞定:
tempArray.push(originalArray.slice(i, i + m));
方法2:手动循环构建
如果需要更灵活的逻辑,手动循环也很清晰:
const subArray = []; for (let j = 0; j < m; j++) { subArray.push(originalArray[i + j]); } tempArray.push(subArray);
非要用eval的写法(不推荐)
如果坚持要用eval,需要把字符串构建成完整的数组字面量,而不是逗号分隔的表达式:
let dynamicSubarrayStr = '['; for (let j = 0; j < m; j++) { dynamicSubarrayStr += `originalArray[i + ${j}],`; } // 去掉最后一个逗号,补上右括号 dynamicSubarrayStr = dynamicSubarrayStr.slice(0, -1) + ']'; tempArray.push(eval(dynamicSubarrayStr));
注意:循环变量别和外层的i重名,避免变量冲突;同时尽量用originalArray代替a,保证变量名清晰。
内容的提问来源于stack exchange,提问作者DevX
相关产品推荐
相关产品推荐

