代码一:
var a = b = ''
a = 1
console.log(a)//打印1
console.log(b)//打印''
代码二:
var a = b = []
a.push(1)
console.log(a)//打印[1]
console.log(b)//打印[1]
为什么代码一两变量不等,而代码二两变量相等?
代码一:
var a = b = ''
a = 1
console.log(a)//打印1
console.log(b)//打印''
代码二:
var a = b = []
a.push(1)
console.log(a)//打印[1]
console.log(b)//打印[1]
为什么代码一两变量不等,而代码二两变量相等?
换种写法你就明白了,实质上是这样的:
代码一:
b=''; //(感谢2楼提醒,原先写的是var b='')
var a=b;;
a=1; //b是基本变量,a和b指向的不是同一个地址,两者的变动互不影响,所以a=1,b不会变
代码二:
b=[];
var a=b;
a.push(a);//b是引用变量,a=b,所以a和b指向同一个地址,所以a.push(1),b也变了
建议去啃一下js高程这本书 弄明白js里面的变量有什么不同 就像一楼所说的值类型和引用类型的区别,var a=b=[],可以简单理解为a,b是不同指针但是指向同一位置(只是理解而已,但是js里是没有指针的,除了this)
这就是涉及到,js数据的基本类型(string,number,boolean,null,undefined)和引用类型(Function,Array,Object)了!
1.基本数据类型的操作,是直接改变保存在变量的实际的值。
//比如,a赋值给b,赋值后怎么改b,不会影响a,怎么改a,也不会影响b
var a=10;
var b=a;
b=5;
放张图,方便理解
2.引用数据类型的操作,实际上是操作对象在栈内存中的引用地址。
//比如,obj1赋值给obj2,无论是改了obj1或者obj2,obj2或者obj1都会改变。
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了
放张图,方便理解
数组和对象在js都是引用类型,同样的道理!
3.如果想引用类型不受影响,可以用其它方式
var b=[1,2,3];
//这样写,怎么改a或者b,都不会影响另一个
var a=Object.assign([],b);
//或者
var a=b.slice(0);
//对象也是这样,怎么改a或者b,都不会影响另一个
var a={name:'aaa'}
var b=Object.assign({},a);
//或者用for-in
var a={name:'aaa'},b={}
for(key in a){
b[key]=a[key]
}
问题中有标签php,属于后台代码了。
php是面向对象编程,基本上所以面向对象语言都有值类型跟引用类型
值类型是直接指向内存当中的数据内容,值类型都是存储在栈里面的,都会在内存里面占用一块存储空间
引用类型是通过地址指向内容的,引用类型都是存储在堆里面的,通过存储在栈里面的地址指向堆里面的内存
你的代码一数据都是属于值类型 所以更改其中一个对另外一个并没有什么影响。
你的代码二数据数据值属于引用类型,两个变量都是指向同一个内存地址,所以更改其中一个,相当于更改指向地址的内容,另外一个指向的是同一个地址,所以更改其中一个另外一个获取值也是一样的
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
这个涉及到传引用还是传值的问题。像数组这种对象,传的是引用,而不是直接复制一个传值。
因此var a=b='',两个是不同地址的。
而var a=b=[],a,b两个是指向相同地址