JavaScript中能否按引用传递矩阵(列表的列表)实现全局修改?
需求可以实现,核心是要修改原数组的内部内容,而非给形参重新赋值新数组
原代码不生效的原因
你当前的写法是直接给函数形参table赋值了一个全新的数组对象,这一步只会修改函数内部局部变量table的内存指向,不会影响外部的grid变量。JS中引用类型的参数传递遵循**传共享(call by sharing)**规则:形参拿到的是原变量指向的内存地址拷贝,直接给形参赋新值只会改拷贝的地址,不会改动原变量的指向,也不会改动原地址上的内容。
正确实现方案
方案1:直接修改原数组内容(推荐,无需修改外部调用逻辑)
直接遍历矩阵的每个元素,在原内存地址上修改值即可,改动会自动同步到外部的grid变量:
var grid = [['T', 'W', 'Y', 'R'], ['E', 'N', 'P', 'H'], ['G', 'Z', 'Qu', 'R'], ['O', 'N', 'T', 'A']]; function changeGrid(table){ // 遍历所有行 for (let row = 0; row < table.length; row++) { // 遍历当前行的所有元素,直接修改值 for (let col = 0; col < table[row].length; col++) { table[row][col] = 'X'; } } } console.log(grid); // 输出原始矩阵 changeGrid(grid); console.log(grid); // 输出全为'X'的矩阵,全局变更已生效
方案2:接收函数返回值覆盖原变量
如果你需要在函数内部生成全新的矩阵,只要把函数的返回值重新赋值给外部的grid变量即可:
// 原函数不需要改动,调用时用返回值覆盖grid即可 grid = changeGrid(grid); console.log(grid); // 全局变更生效
内容的提问来源于stack exchange,提问作者jayfish
相关产品推荐
相关产品推荐

