当前位置: 首页 > Web前端 > HTML

大厂HR面试精要ES6深度面试题知识点

时间:2023-04-02 12:18:04 HTML

ESMAScript6介绍,ES6是JavaScript语言的下一代标准,目的是让JavaScript语言编写复杂的大型应用,成为企业级语言。那么ECMAScript和JavaScript是什么关系呢?两者之间有什么联系?JavaScript的创造者Netscape将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA决定了浏览器脚本语言的标准,并将其命名为ECMAScript。由于某些原因,一是商标,二是该语言是由ECMA开发的,而不是Netscape。ECMAScript和JavaScript的关系是前者是后者的规范,后者是前者的实现。ES6let和const命令let命令:基本用法,ES6增加了let命令来声明变量,用法与var类似,但声明的变量只在let命令所在的代码块中有效。{让a=10;varb=1;}a//ReferenceError:aisnotdefinedb//1let和var声明了两个变量,然后在代码块外调用这两个变量,let声明的变量报错,var声明的变量返回正确的值。注意,let声明的变量只在它所在的代码块中有效。for(leti=0;i<10;i++){}console.log(i);//ReferenceError:iisnotdefinedvara=[];for(vari=0;i<10;i++){a[i]=function(){console.log(i);};}a[6]();//10使用let,声明的变量只在块级作用域内有效:vara=[];for(leti=0;i<10;i++){a[i]=function(){console.日志(我);};}a[6]();//6变量i是let声明的,当前i只在当前循环有效,所以每次循环中的i其实都是一个新的变量,所以最后输出6。var中没有变量提升。var中有变量提升,let中不会出现“变量提升”的现象。所以变量必须在声明之后使用,否则会报错。控制台日志(一);//输出undefinedconsole.log(b);//报错ReferenceErrorvara=1;letb=1;var声明的变量会被提升,变量已经存在没有赋值,但是如果没有值,会输出undefined。变量是用let命令声明的,不会发生变量提升。在声明变量之前,变量不存在。如果使用,会报错。用let声明的变量是可以修改的,而const一般用来声明常量,声明后不能再改变。让a=1;constb=2;a=3;b=3;//var命令声明的变量会引起变量提升。变量在声明前使用,其值是undefined,而let命令声明的变量没有变量提升,如果在声明前使用,会报错。临时死区,一个变量在块级作用域内用let声明之前,该变量是不可用的,称为临时死区。da='coding';if(true){//之前定义一个全局变量da,在block中重新定义一个daconsole.log(da);//错误ReferenceErrorletda;}不允许重复声明:let命令不允许重复声明同一个变量if(true){letda;让大;//报错}functionfunc(coding){//已经有变量名的形参letcoding;}func()//在报错的代码块中,该变量直到let命令才可用用于声明变量,称为临时死区。如果(真){temp='da';//ReferenceErrorconsole.log(temp);//ReferenceErrorlettemp;//TDZ结束console.log(temp);//未定义的温度=12;控制台日志(临时);//12}临时死区表示typeof不再是安全操作typeofx;//ReferenceErrorletx;变量x是使用let命令声明的,所以存在死区,使用这个变量会报错,对比一下,如果一个变量根本没有声明,使用typeof不会报错typeofdacoding//undefinedES6:vararr=[];for(vari=0;i<10;i++){arr.push(function(){console.log(i)})}arr.forEach(function(func){func()});//ES5vararr=[];for(vari=0;i<10;i++){func.push((function(value){returnfunction(){console.log(value);}}(i))}//ES6for(leti=0;i<10;i++){func.push(function(){console.log(i)的特点})}箭头函数:创建函数不需要function关键字,return关键字为省略,继承当前上下文的this关键字。let声明变量,const声明常量,都是块级作用域ES5没有块级作用域,var有变量提升。在let中,变量使用必须声明。箭头函数,定义时不用关键字function(),而是用箭头()=>来表示。模板字符String是字符串的增强版,用反引号(`)表示,可以用作为一个普通的字符串,可以定义多行字符串解构赋值,ES6允许按照一定的模式从数组和对象中取值,给变量赋值,for...of循环可以遍历数组,设置和地图结构。集合数据结构类似于数组,所有数据都是唯一的,没有重复值,是一个构造函数,class类继承,ES6在ES5中没有使用原型链实现继承,类概念的引入可以用于继承//基本用法constda1=function(参数1,参数2,...,参数N){函数声明}constda1=(参数1,参数2,...,参数N)=>{函数声明}//只有一个参数时,括号可选constda2=(单参数)=>{函数声明}constda2=单参数=>{函数声明}//没有参数时,括号不能省略constda3=()=>{函数声明}//当函数体只返回单个表达式时,花括号和return关键字可以省略constda4=()=>{returnexpression(single)}constda4=()=>expressionFormula(single)//函数体返回对象字面量表达式时,如果省略花括号和return关键字,返回值需要加上括号constda5=()=>{return{foo:'bar'}}constda5=()=>({foo:'bar'})//输出{foo:'bar'}constda6=()=>{foo:'bar'}//输出undefined,大括号被识别为代码块块级作用域:es5只有全局作用域和函数作用域,没有块级作用域:vartemp=newDate();functionf(){console.log(temp);if(false){vartmp="你好世界";}}F();//undefineddes6的块级作用域:functionf1(){letn=5;如果(真){让n=10;}console.log(n);//5}//IIFE写法(function(){vartemp=...;...}());//块级作用域写法{lettemp=...;...}在es5中,函数只能在顶层作用域和函数作用域中声明,不能在块级作用域中声明//Case1if(true){functionf(){}}//Case2try{functionf(){}}catch(e){}//ES5规定是非法的//ES5严格模式'usestrict';if(true){functionf(){}}//es6中引入了块级作用域报错,明确允许在块级作用域中声明函数//ES6严格模式'usestrict';if(true){functionf(){}}//不报错es6block-levelscope声明函数仅在使用花括号时建立//不报错'usestrict';if(true){functionf(){}}//报告错误'usestrict';if(true)functionf(){}箭头函数:使用箭头函数时,this指向的不是窗口,而是父窗口。arguments对象不能用,constructor不能用,new命令也不能用,否则会报错,yield命令也不能用。所以箭头函数不能再用作生成器函数。map和set的区别:set用于数据重组,map用于数据存储。set中的元素不能重复,只有没有键名的键值,类似于数组,可以遍历,有add、delete、has等方法。map的本质是键值对的集合,可以与各种数据进行遍历和转换。外观类class://定义classPoint{constructor(x,y){//构造方法this.x=x;//this关键字表示实例对象this.y=y;}toString(){返回'('+this.x+','+this.y+')';}}promise构造函数是同步执行的,then方法是异步执行的。函数Person(){this.age=10;setInterval(()=>{this.age++;//this正确指向p实例},100);}varp=newPerson();//1s后打印出来10this.param=1constfunc1=()=>console.log(this.param)constfunc2=function(){console.log(this.param)}func1.apply({param:2})//输出:1func2.apply({param:2})//输出:2解构赋值:let[a,b,c]=[1,2,3]//a:1b:2c:3let[a,[[b],c]]=[1,[[2],3]]//a:1b:2c:3let[a,,b]=[1,2,3]//a:1b:3let[a,...b]=[1,2,3]//a:1b:[2,3]let[a,b,...c]=[1]//a:1b:undefinedc:[]let[a,b=4]=[null,undefined]//a:nullb:4let[a,b=4]=[1]//a:1b:4let[a,b=4]=[1,null]//a:1b:null如果解构不成功,变量的值是undefined,解构指定默认值。如果解构变量对应的位置没有值,为空或undefined,默认值有效。let{a,b}={a:1,b:2}//a:1b:2let{c}={a:1,b:2}//c:undefinedlet{c=4}={a:1,b:2}//c:4let{a:c}={a:1,b:2}//c:1let{a:c=4,d:e=5}={a:1,b:2}//c:1e:5let{length}=[1,2]//length:2展开运算符:将数组转换为以逗号分隔的参数序列console.log(...[1,2,3])//123console.log(1,...[2,3,4],5)//12345[...document.querySelectorAll('div')]//[

,
,
]{...{a:1},...{a:2,b:3}}//{a:2,b:3}[...[1],...[2,3]]//[1,2,3]constarr=[1]arr.push(...[2,3])//arr:[1,2,3默认参数:functionlog(x,y='World'){console.log(x,y)}log('Hello')//HelloWorldlog('Hello',undefined)//HelloWorldlog('Hello','China')//HelloChinalog(undefined,'China')//undefinedChinalog(,'China')//错误SyntaxErrorlog('你好','')//你好日志('你好lo',null)//你好如果不传null参数或者传undefined,参数会等于默认值。如果参数不是最后一个,不传参数会报错。传递null不会使函数参数等于默认值。//获取函数的所有参数,rest为数组函数func1(...rest){/*...*/}//获取除函数第一个参数外的其他参数,rest为数组函数func1(val,...rest){/*...*/}模板字符串:varstr=`abcdefgh`;console.log(str);letname="Xiaoming";functiona(){return"ming";}console.log(`我叫${name},年龄${17+2}岁,性别${'男'},游戏ID:${a()}`);函数默认参数:functionA(a,b=1){console.log(a+b);}A(1);//2A(2+3);//5functionA(a,b=1){console.log(a+b);}A(1);//2A(2+3);//5箭头函数://省略写法varpeople=name=>'hello'+name;vargetFullName=(firstName,lastName)=>{varfullName=firstName+lastName;returnfullName;}对象扩展:varfoo='bar';varbaz={foo};//相当于varbaz={foo:foo};varo={method(){返回“你好!”;}};//等同于varo={method:function(){return"Hello!";}};Promise对象有三种状态,pending-inprogress,resolved-completed,rejected-failed。varpromise=newPromise((resolve,reject)=>{varsuccess=true;if(success){resolve('success');}else{reject('failure');}}).then((数据)=>{console.log(data)},(data)=>{console.log(data)})setdatastructuresizelengthofdataadd()添加一个值并返回Set结构本身。delete()删除一个值并返回一个布尔值,指示删除是否成功。has()找到一条数据并返回一个布尔值。clear()清除所有成员并且没有返回值。扩展运算符扩展运算符(...)将字符串转换为数组varstr="abcd";console.log([...str])//["a","b","c","d"]将集合转换为数组varset=newSet([1,2,3,4,5])console.log([...set])//[1,2,3,4,5]数组合并vara1=[1,2,3];vara2=[4,5,6];console.log([...a1,...a2]);//[1,2,3,4,5,6]剩余参数...变量名functionfunc(...args){console.log(args);//[1,2,3,4]}func(1,2,3,4);函数f(x,...y){console.log(x);console.log(y);}f('a','b','c');//aand["b","c"]f('a')//aand[]f()//undefinedand[]classicvarval="globalvariable";{letval="localvariable";控制台.log(val);//局部变量}console.log(val);//全局变量constval="constant";val="123";//未捕获的TypeError:分配给常量变量。迭代器,for...of和for...in//forin将继承for(letiiniterable){console.log(i);//依次打印0,1,2,"foo","arrCustom","objCustom"}for(letiiniterable){if(iterable.hasOwnProperty(i)){console.log(i);//打印0,1,2,"foo"}}//forforor(letiofiterable){console.log(i);//依次打印3,5,9}forEach,forin,forof的区别:forEach遍历数组,forin遍历对象或者json,forof数组对象可以遍历,forin循环是关键,forof循环是valueconstpromise=newPromise((resolve,reject)=>{console.log(1);resolve();console.log(2);})promise.then(()=>{console.log(3);})console.log(4);1243Promise.then()内部代码在当前事件循环结束时立即执行。关于当前文章的内容,涉及前端和PHP知识点。有兴趣的可以关注一下。很荣幸被你发现。真是有见地!感谢您的关注。在以后的日子里,希望大家一直默默支持我,我会努力写出更多优秀的作品。我们一起成长,从零开始学习编程,将Web前端领域、数据结构与算法、网络原理,通俗易懂的呈现给小伙伴们。分享Web前端相关的技术文章、工具资源、精选课程、热点资讯。推荐阅读1、你对这个、new、bind、call、apply了解多少?那我告诉你2.为什么要学JavaScript设计模式,因为它是核心3.一篇文章带你走进JavaScript中的闭包和高级函数。:涉及版权或其他问题),请及时联系我们整改,我们会尽快处理。感谢阅读,原创不易,喜欢请点个赞,这是我写作最大的动力。欢迎来到达达简书!这是一个有品质有态度的博客