浅谈JavaScript的赋值操作的一些问题

开篇语:以前面试时经常会被面试官问到JavaScript中的一些基础性问题,可JavaScript正好又是自己的弱项,所以一些好工作自然就与自己失之交臂了。可正是这样,自己才开始意识到JavaScript对于前端开发的重要性,才开始努力地深入学习这门语言。接下来我就来讲讲JavaScript中赋值操作的一些问题。

1、首先讲一下值类型的赋值操作。值类型有个特点就是,每一个值类型变量都有其各自的存储地址,一个值类型变量的值变化不会影响其他值类型变量的值。例如:

var  a =“张三”;

var  b = a;

a =“李四”;

console.log(b);   //张三

以下是chrome浏览器控制台的测试结果:

这个应该很好理解,b = a表达式将a的值赋给了b,所以b的值为“张三”,而后面就算a变成了“李四”,那跟b又没有什么关系,b还是b,还是“张三”。

2、接下来再讲讲引用类型的赋值操作。引用类型有个特点就是,引用类型变量的存储地址可能公用同一个,其中一个变量值的改变可能会造成其他变量值也跟着改变。例如:

var a = [1,2,3], b = a;

a[2] = 8;

console.log(a==b)   //true

console.log(b[2])   //8

以下是chrome浏览器控制台的测试结果:

这个原理其实也很简单,因为数组其实就是一种引用类型,其他引用类型还包括Object和Function。以上表达式b = a只是将a的引用赋值给b,其实就是将a变量的地址赋值给b,而a、b两个变量其实是指向同一个地方的,所以当a数组中的某个值变化时,b数组相应的那个值当然也会跟着变化。可是,如果接下来让a = null又会出现什么样的情况呢?我们测试一下看看:

a = null;

console.log(b[2]);   //8

这下就奇怪了,刚刚不是还说a和b共用同一个存储空间吗?现在怎么a变成了null了,b却还是保持原来的值呢?其实呢,a和b两个变量中储存的都只是数组的一个存储地址而已,而真正数组的值是存在于另外一块存储空间的。当a = null时,也就是将a中原来存储的地址清空了,而数组的那块存储空间还在,只是将变量a和数组之间的联系断开了而已。然而此时b仍然指向[1,2,8]这个数组,所以可以将b[2]的值正常输出。

现在如果已经理清楚了上面的这些问题,那么下面这种情况应该就很好理解了。

var a = {name:”张三”};

var b = a;

a = {name:”李四”};

console.log(b.name);   //张三

这个例子中,a被重新赋值新的地址,指向对象{name:”李四”},而b仍然是指向之前的{name:”张三”}。

结束语:通过以上分析,相信你对赋值,包括数据的存储也有一定了解了吧,这里关键在于理解引用类型,因为引用类型变量存储的地址并非实际的数值而只是地址而已。

本文为原创文章,转载请注明出处,谢谢!

上一篇:一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要


下一篇:如何对ConnectionString进行加密解码?