问题(已解决):push pop for循环中push变量,变量随之改变的问题

来源:互联网 发布:纹身图案软件 编辑:程序博客网 时间:2024/06/05 02:14

今天做剑指Offer的时候碰到了这个问题,push一个数组,这个数组也在pop元素,为什么push没有直接把结果放进去,而放的一个指向

var x = [];var y = [1,2,3];for(var i = 0; i < 5; i++) {    x.push(y);    y.pop();}console.log(x);/*结果是这个[Array(0), Array(0), Array(0), Array(0), Array(0)]*/
var x = [];var y = [1,2,3];for(var i = 0; i < 5; i++) {    x.push(y.slice());//新创建的就可以    y.pop();}console.log(x);/*结果是 [Array(3), Array(2), Array(1), Array(0), Array(0)]*/

探究:
1.push 或 pop方法的原因?
2.数组的原因?

(1)和push,pop无关,

//和push无关var x = [];var y = [1,2,3];for(var i = 0; i < 5; i++) {    x[i] = y;    y.pop();}console.log(x);// [Array(0), Array(0), Array(0), Array(0), Array(0)]//和pop无关var x = [];var y = [1,2,3];for(var i = 0; i < 5; i++) {    x.push(y);    y.push(i);}console.log(x);//[Array(8), Array(8), Array(8), Array(8), Array(8)]

(2)和数组有关

//如果一方为数字 则正常var x = [];var y = 5;for(var i = 0; i < 5; i++) {    x.push(y);    y --;}console.log(x);//[5, 4, 3, 2, 1]
//和数组,对象有关var x = [];var y = {};for(var i = 0; i < 5; i++) {    x.push(y);    y[i] = i;}console.log(x);//[Object, Object, Object, Object, Object] 五个objecet都一样

已解决:这个问题和JS中引用数据类型和基本数据类型的保存有关:
用变量来保存数组、对象,这个变量只是保存的指向他们的地址,而不是这个数组、对象本身,因此本文中,x这个数组中的5个y,全是指针,y指向的东西改变,就会改变。
看下面这个例子:

var x = [];var y = [1,2,3];for(var i = 0; i < 5; i++) {    x.push(y);    y.pop();}console.log(x);// [Array(0), Array(0), Array(0), Array(0), Array(0)]//下面y指向的数组加1,x随之改变y.push(1);console.log(x); //[Array(1), Array(1), Array(1), Array(1), Array(1)] //取变量point也为这个指针,和y指向同一个变量,point改变,x同样会改变var point = y;point.push(2);console.log(x)//[Array(2), Array(2), Array(2), Array(2), Array(2)]

更多关于基本数据类型和引用数据类型的保存请看 http://www.jianshu.com/p/996671d4dcc4

原创粉丝点击