关于new Array();放在for循环里面和外面的区别问题。

#麻辣小龙虾# 2017-09-18 03:42:00
new Array()放在外面时

var arr = new Array();
var obj = new Object();
for(var i=0;i<5;i++){
obj.num = i;
arr.push(obj)
}
console.log(arr);


运行结果:


你会发现obj.num 都等于 4。

new Array()放在里面时
var arr = new Array();
for(var i=0;i<5;i++){
var obj = new Object();
obj.num = i;
arr.push(obj)
}
console.log(arr);

结果如下:

你会发现每个obj.num的结果成递增。

第一个理解为obj是一个全局变量,虽然每次循环i的值都会自增,但是每次循环都将重置之前obj.num的值,循环结束之后obj.num的指针地址依然是指向i所在的内存单元,那么i最后的值就为4。(不知道这样理解对不对),但是放在for循环里面的时候,也是引用同一个i,虽然每次都重新定义了一个。

请教大神能否解释一下为什么会这样?出现这样的结果的原因是什么,可否用数据结构或者内存单元地址等知识解释一下。非常感谢~

...全文
567 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2017-09-18
  • 打赏
  • 举报
回复
对象和数组都是按地址传递的。比如 objA = objB 是让 objA 和 objB 指向同一个内存地址。而不是把objB对象的内容复制一份赋值给objA。 你的代码var obj = new Object();在循环外时。就从始至终就创建了一个对象。循环中每次obj.num = i;都是在改变同一个对象的num属性。每次push()进数组的也都是这同一个对象的地址。 当var obj = new Object();在循环内时。每次循环都会创建一个全新的对象。循环中每次push()进数组的都是不同的对象的地址。
当作看不见 2017-09-18
  • 打赏
  • 举报
回复
var a = new Object(); var b = a; a.x =1; console.log(b.x);//1 这种就是引用类型赋值并没有产生新的对象,而是共用一个对象,所以以后还会遇到深度复制引用类型的问题.
当作看不见 2017-09-18
  • 打赏
  • 举报
回复
第一种情况,你就声明了一个对象,每次都修改同一个对象的值然后压入数组,数组中的成员全部相同,修改一个,都会同步的,由于这是引用类型 第二种情况,声明了4个 对象,每次修改的都是不同的对象,,所以值 不相同, 引用类型是指 数字,字符串,undefined,null之外的所有
Go 旅城通票 2017-09-18
  • 打赏
  • 举报
回复
放外面,obj是对象,对obj的任何修改都会反映都这个对象,你的数组存储的同一个obj,所以全部被改了 放里面就是生成了不同的新对象

Web开发学习资料推荐
javascript函数属性caller和arguments callee介绍
JavaScript apply与call的用法及区别

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧