当前位置: 首页 > 科技观察

JavaScript常见易错知识点整理

时间:2023-03-11 20:38:42 科技观察

前言本文是我学习JavaScript过程中收集整理的一些易错知识点,从变量作用域、类型比较、this点、函数参数、闭包问题和对象六个方面copy和assignment由浅入深地介绍和讲解,还涉及到一些ES6的知识点。JavaScript知识点1.变量作用域vara=1;functiontest(){vara=2;console.log(a);//2}test();a在函数作用域上面声明赋值,在console上面,所以遵循就近原则输出a等于2vara=1;functiontest2(){console.log(a);//undefinedvara=2;}test2();虽然在上面的函数作用域中声明并赋值了a,但它位于控制台之下,并且提升了a变量。它已被声明但尚未赋值,因此输出“undefined”。vara=1;functiontest3(){console.log(a);//1a=2;}test3();在上面的函数作用域中,a被重新赋值,没有被重新声明,并且位于控制台下,所以在全局作用域中输出a。letb=1;functiontest4(){console.log(b);//未定义letb=2;}test4();上述函数作用域中使用的ES6let重新声明了变量b,而let不同于var,不存在变量提升的功能,所以输出报错“bisnotdefined”。functiontest5(){leta=1;{leta=2;}console.log(a);//1}test5();在上面的函数作用域中,a用let声明为1,在块级作用域中A声明为2,因为console不在函数的块级作用域中,所以输出1。2.类型比较vararr=[],arr2=[1];console.log(arr===arr2);/比较上面两个不同的数组/false,控制台为false。vararr=[],arr2=[];console.log(arr===arr2);//false比较上面两个相同的数组,因为两个分开的数组永远不相等,所以console为false。vararr=[],arr2={};console.log(typeof(arr)===typeof(arr2));//使用上面的typeoftrue来比较数组和对象,因为typeof获取的是NULL,数组,对象类型都是所有对象,因此控制台为真。vararr=[];console.log(arrinstanceofObject);//trueconsole.log(arrinstanceofArray);//true使用上面的instanceof来判断一个变量是否属于一个对象的实例,因为数组也是一种对象JavaScript,所以两个控制台都是真的。3.this指向varobj={name:'xiaoming',getName:function(){returnthis.name}};console.log(obj.getName());//上面'xiaoming'指向的对象方法中的this对象本身,所以输出“xiaoming”。varobj={myName:'xiaoming',getName:function(){returnthis.myName}};varnameFn=obj.getName;console.log(nameFn());//上面undefined将对象中的方法赋值给一个变量在这一次,方法中的this将不再指向obj对象,从而指向window对象,所以console是“undefined”。varobj={myName:'xiaoming',getName:function(){returnthis.myName}};varobj2={myName:'xiaohua'};varnameFn=obj.getName;console.log(nameFn.apply(obj2));//上面的'xiaohua'也是将obj对象中的方法赋值给了变量nameFn,但是这个点通过apply方法到obj2对象,所以最终的控制台是'xiaohua'。4.函数参数functiontest6(){console.log(arguments);//[1,2]}test6(1,2);上面使用函数中的arguments对象获取传入函数的参数数组,所以输出数组[1,2]。functiontest7(){returnfunction(){console.log(arguments);//这里没有执行,没有输出}}test7(1,2);上面也是使用arguments获取参数,但是因为test7(1,2)没有执行return中的函数,所以没有输出。如果执行test7(1,2)(3,4),则输出[3,4]。varargs=[1,2];functiontest9(){console.log(arguments);//[1,2,3,4]}Array.prototype.push.call(args,3,4);test9(...args);上面使用Array.prototype.push.call()方法将3和4插入到args数组中,使用ES6扩展操作符(...)扩展数组传入test9,所以控制台是[1,2、3、4]。5.关闭问题varelem=document.getElementsByTagName('div');//如果页面上有5个divfor(vari=0;i