var同时赋值问题

代码一:

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]

为什么代码一两变量不等,而代码二两变量相等?

阅读 4.7k
5 个回答

这个涉及到传引用还是传值的问题。像数组这种对象,传的是引用,而不是直接复制一个传值。

因此var a=b='',两个是不同地址的。
而var a=b=[],a,b两个是指向相同地址

换种写法你就明白了,实质上是这样的:

代码一:
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;

放张图,方便理解
clipboard.png

2.引用数据类型的操作,实际上是操作对象在栈内存中的引用地址。

    //比如,obj1赋值给obj2,无论是改了obj1或者obj2,obj2或者obj1都会改变。
    var obj1 = new Object();
    var obj2 = obj1;
    obj2.name = "我有名字了";
    console.log(obj1.name); // 我有名字了

放张图,方便理解

clipboard.png

数组和对象在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是面向对象编程,基本上所以面向对象语言都有值类型跟引用类型
值类型是直接指向内存当中的数据内容,值类型都是存储在栈里面的,都会在内存里面占用一块存储空间
引用类型是通过地址指向内容的,引用类型都是存储在堆里面的,通过存储在栈里面的地址指向堆里面的内存

你的代码一数据都是属于值类型 所以更改其中一个对另外一个并没有什么影响。
你的代码二数据数据值属于引用类型,两个变量都是指向同一个内存地址,所以更改其中一个,相当于更改指向地址的内容,另外一个指向的是同一个地址,所以更改其中一个另外一个获取值也是一样的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题