JS错题理解之变量、作用域
如果两个不同类型的数据进行==比较,会把左右转换成同一类型再比较,
如果一个运算数是对象,另一个是数字,会把对象转换成数字。
[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
1var 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次。