美文网首页
JS错题理解之变量、作用域

JS错题理解之变量、作用域

作者: Leophen | 来源:发表于2019-05-09 14:06 被阅读0次

    如果两个不同类型的数据进行==比较,会把左右转换成同一类型再比较,
    如果一个运算数是对象,另一个是数字,会把对象转换成数字。
    [4]转化为数值类型,所以[4]==4为true;

    以下程序的输出结果是什么?


    3-9.jpg

    从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象,当给变量赋新值时,此变量就不再指向原来的对象了;
    数组是引用类型的 , 如题中b=a相当于a与b指向同一个地址 , 但是a=[4,44]之后改变了a的地址 , 所以b不会受到影响 为[4] . 后面又把a=b指向了同一个地址 ,此时为b添加元素 , 因为a、b的地址都没有改变 ,a也会随之改变 ,所以a为[4,44];所以最终结果为:[4],[4, 44]

    null是Null类型,属于基本类型,但是typeof null 返回的是字符串'object';instanceof不能检测基本数据类型,只要是基本数据类型和instanceof连用,返回的都是false

    以下程序的输出结果是?


    4-2

    因为不用var声明的变量是全局变量,y是全局变量,可以输出;x是局部变量,因此输出x会报错,所以最终结果为:1,报错

    以下程序的输出结果是?


    4-3

    因为不用var声明的变量是全局变量,所以函数中声明的是全局变量,所以最终结果为:xh,xh

    有三个按钮,从头到尾,分别点击3个按钮,弹出的结果分别是什么?


    4-5&4-8

    由于先绑定,后触发,给每个按钮绑定事件,但是在触发的时候i已经是循环完之后,i的值了,所以最终结果为:3,3,3
    如果要改进,如下

    var btns = document.getElementsByTagName('button');
    function demo(i) {
      btns[i].onclick = function(){
          alert(i);
      }
    }
    for (var i = 0; i < 3; i++) {
      demo(i);
    }
    

    以let 声明的变量 不会进行预解析
    函数表达式不进行预解析

    输出结果:

    1
    1

    var a = 1;
    function fn(a) {
      console.log(a);
      a = 2;
    }
    fn(a); //此时有参数了,所以将1传入
    console.log(a);
    

    为了获得更好的性能,我们需要及时解除无用数据的引用;
    离开作用域的值不会立刻被回收,只是会被打上标记,在垃圾收集期间才会回收;
    在老版本的IE中访问非原生JS对象(DOM和BOM元素)时,引用计数这种算法可能导致循环引用的问题;
    解除变量引用有助于消除循环引用现象

    计算数组[4]的引用次数是多少?

    var a = [4];
    var b = a;
    b = {};
    b.arr = a;
    b = null;
    

    下面是数组[4]被引用的过程以及被引用次数的变化:
    var a = [4]; // 1次
    var b = a; // 2次
    b = {}; // b的指向变了,所以是1次
    b.arr = a; // 又被指向了1次,所以是2次
    b = null; //b被清空了,所以最后是1次。

    相关文章

      网友评论

          本文标题:JS错题理解之变量、作用域

          本文链接:https://www.haomeiwen.com/subject/jwneoqtx.html