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

今天做剑指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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值