
本文揭示了 JavaScript 中因对象引用共享引发的函数输出不一致问题——createBlock() 在单独调用时结果正确,但被 createListOfBlocksGrid() 调用后所有返回值均变为同一错误数组,根本原因是 DEFAULT_BLOCK_GRID 被多次复用并原地修改。
本文揭示了 javascript 中因对象引用共享引发的函数输出不一致问题——createblock() 在单独调用时结果正确,但被 createlistofblocksgrid() 调用后所有返回值均变为同一错误数组,根本原因是 default_block_grid 被多次复用并原地修改。
该问题本质是 JavaScript 中对象(包括数组)按引用传递的经典陷阱。在原始代码中,DEFAULT_BLOCK_GRID 被声明为 const,但这仅阻止变量重新赋值,并不冻结其内部结构。当 createBlock() 执行 newBlock[i][j] = true 时,实际是在直接修改 DEFAULT_BLOCK_GRID 的底层内存地址所指向的数据。因此,每次调用 createBlock() 都在污染同一个数组实例,后续调用自然返回已被篡改的“脏”数据。
修复的核心原则是:每次调用都应生成独立的、互不影响的新数组副本。推荐将 DEFAULT_BLOCK_GRID 移入函数作用域,并使用深拷贝或结构化初始化确保隔离性。以下是优化后的实现:
const BLOCKS_MATRIX = {
1: [[true]],
2: [[true, true]],
3: [[true, true], [false, true]],
// ...(其余数据保持不变)
21: [[true, true, false], [false, true, false], [false, true, true]]
};
function createBlock(block) {
// ✅ 每次调用都创建全新二维数组,彻底避免引用共享
const DEFAULT_BLOCK_GRID = [
[false, false, false, false],
[false, false, false, false],
[false, false, false, false]
];
// 使用 map + slice 实现浅拷贝(适用于本例中布尔值的一维嵌套)
const newBlock = DEFAULT_BLOCK_GRID.map(row => [...row]);
for (let i = 0; i < newBlock.length; i++) {
if (i >= block.length) break;
for (let j = 0; j < newBlock[i].length; j++) {
// ⚠️ 原代码存在严重笔误:block.length[i] → 应为 block[i].length
if (j >= block[i].length) continue;
if (block[i][j] === true) {
newBlock[i][j] = true;
}
}
}
return newBlock;
}
function createListOfBlocksGrid() {
const blocksGrid = [];
for (const [key, value] of Object.entries(BLOCKS_MATRIX)) {
const blockInstance = createBlock(value); // ✅ 每次获得独立副本
blocksGrid.push(blockInstance); // 注意:原代码 push(value),应为 push(blockInstance)
}
return blocksGrid;
}
// 验证示例
console.log("单独测试:", createBlock([[true, true], [false, true]]));
// 输出:[[true, true, false, false], [false, true, false, false], [false, false, false, false]]
console.log("批量生成:", createListOfBlocksGrid());
// 每个元素均为各自独立、正确的布局数组关键修正点总结:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 作用域隔离:
DEFAULT_BLOCK_GRID移入createBlock内部,配合map([...row])创建新数组实例; - ✅ 逻辑纠错:修复
block.length[i]这一语法错误(block.length是数字,不可索引),改为block[i].length; - ✅ 语义修正:
createListOfBlocksGrid()中应push(createBlock(value)),而非push(value)(原代码未实际存储生成结果); - ? 进阶建议:若
BLOCKS_MATRIX结构更复杂(含深层嵌套),可使用JSON.parse(JSON.stringify(DEFAULT_BLOCK_GRID))或结构克隆库(如 Lodash 的cloneDeep)实现深拷贝。
遵循“函数纯度”原则——输入相同则输出确定且无副作用,是编写可靠前端逻辑的基石。此案例提醒我们:const 不等于不可变,引用类型的安全操作必须显式克隆。
立即学习“Java免费学习笔记(深入)”;

















