数组Double变量输出undefined及循环添加对象重复值与动态命名求助
问题解决指南
一、先解决你遇到的核心问题:循环添加对象重复、调用对象undefined
你碰到的数组对象重复+调用时提示undefined,大概率是循环里复用了同一个对象引用导致的。举个常见的错误写法例子:
let arr = []; let osoba = {}; // 只创建了一个对象实例 for (let i = 0; i < 3; i++) { osoba.username = `用户${i}`; arr.push(osoba); } console.log(arr); // 数组里的三个元素全是最后一次修改的对象
原因很简单:每次循环修改的都是同一个osoba对象,数组里存的都是这个对象的引用,所以看起来全是重复值。如果后续调用时没正确取到数组元素,就会触发undefined提示。
正确解决方式:每次循环都创建一个新的对象实例:
let arr = []; for (let i = 0; i < 3; i++) { let osoba = {}; // 循环内创建新对象,每次都是独立实例 osoba.username = `用户${i}`; // 关于Double类型变量:JS里没有单独的Double类型,所有数字都是Number类型(包含浮点数) osoba.score = 89.5; // 直接赋值浮点数即可,避免未赋值导致的undefined arr.push(osoba); } console.log(arr); // 每个元素都是独立的对象 // 调用数组中的对象示例: console.log(arr[0].username); // 输出"用户0"
至于Double类型变量输出undefined,检查下是否存在变量未赋值、拼写错误,或者作用域问题(比如变量在循环外未声明)。
二、关于让对象名称按osoba、osoba1、osoba2递增命名的需求
首先不太推荐直接创建多个独立变量(比如osoba、osoba1...),因为这种分散的变量很难统一管理,不如用数组来存储所有对象(比如上面代码里的arr,通过arr[0]、arr[1]就能访问对应对象,效果和osoba、osoba1完全一致,还更灵活)。
如果确实需要创建动态命名的变量,在浏览器环境下可以通过window对象实现:
for (let i = 0; i < 3; i++) { let objName = i === 0 ? 'osoba' : `osoba${i}`; window[objName] = { username: `用户${i}` }; } // 现在可以直接访问这些变量 console.log(osoba.username); // 输出"用户0" console.log(osoba1.username); // 输出"用户1"
但这种方式会污染全局作用域,容易引发变量冲突,所以还是更建议用数组或一个统一的对象来集中管理这些实例。
内容的提问来源于stack exchange,提问作者Stefan Sipic
相关产品推荐
相关产品推荐

