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

2019-05-09  本文已影响0人  Leophen

如果两个不同类型的数据进行==比较,会把左右转换成同一类型再比较,
如果一个运算数是对象,另一个是数字,会把对象转换成数字。
[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次。

上一篇下一篇

猜你喜欢

热点阅读