js笔试题之变量连续赋值题

先看一道笔试题:求打印结果

      var a = {s:"sss"};
      var b = a;
      a.x = a = {m:"mmm"};
      console.log(a.x);
      console.log(b.x);

先不说结果,说一下这个题的两个考点

1.连续赋值的拆分

2.变量的类型以及它们的堆栈分配

下面就一一讲一下这两个点

1.连续赋值问题

       var a = {s:'55'};
       var b = a = 5;
       console.log(a);  //5
       console.log(b);  //5

上面的的例子可以看出连续赋值不是从左到右依次进行而是: 

       var a = {s:'55'};
       var b;
       b=5; a=5;  //等价于  b = a = 5;

2.变量的类型以及它们的堆栈分配

js的变量类型分两类

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol

引用数据类型:对象(Object)、数组(Array)、函数(Function)

不同数据类型对应堆栈内存

基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。

引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。

知识点完了,接下来就是对题的解剖

第一步:根据知识点一进行连等变形

      var a = {s:"sss"};
      var b = a;
      a.x = {m:"mmm"};
      a = {m:"mmm"};
    //a.x = a = {m:"mmm"};
      console.log(a.x);
      console.log(b.x);

一变形就可以看出 a.x 的值为 undefined;

第二步:根据题话堆栈图

①先话这一部分的

      var a = {s:"sss"};
      var b = a;
      

js笔试题之变量连续赋值题_第1张图片

 

②画  a.x = {m:"mmm"}

js笔试题之变量连续赋值题_第2张图片

 ③画 a = {m:"mmm"}

js笔试题之变量连续赋值题_第3张图片

执行完之后很清楚的看出

a的值为{m:"mmm"}

b的值为{m:"mmm",s:"sss"}

你可能感兴趣的:(JavaScript)