1.var,let,constvar1.预解析(变量提升)2.变量可以重复声明let1.不支持预解析(必须先声明,2.不支持重复声明3.支持块级作用域1.Example—preparseconsole.log(a);//undefindvara=2;console.log(b);//Error,bisnotdefined.letb=3;由于var是预解析的,所以不会报错letdoesnothavepre-parsingconsole.log(a);//undefindvara=2;//上面的代码是等价的to:vara;console.log(a);a=2;2.示例-重复声明变量vara=1;vara=2;console.log(a);//2letb=1;letb=2;console.log(b);//Error,Identifier'b'hasalreadybeendeclared.bhasbeendeclared3.例子——块级作用域{vara=1;letb=2;console.log(b);//2{console.log(b);//2}}console.log(a);//1console.log(b);//报错,bisnotdefinedconstconstant1.初始化后,内部值不能改变,必须要初始化赋值的问题。2.不支持预解析3.不允许重复声明4.支持块级作用域constExample:consta;console.log(a);//错误,const声明中缺少初始值设定项。a未分配。常量b=1;b=2;console.log(b);//报错,赋值给常量变量。常量的值不能改变2.解构赋值1.对象解构赋值,变量名必须和键名相同??,顺序不重要,用{}括起来(1)解构变量时被声明并赋值varobj={a:1,b:2,c:"lzf"};var{a,c,b}=obj;console.log(a,b,c);//12"lzf"(2)变量声明后赋值时解构varobj={a:1,b:2,c:"lzf"};vara,b,c;({a,b,c}=obj);console.log(a,b,c);//12"lzf"2.数组解构赋值,按数组顺序赋值,变量名不重要,用[]括起来varattr=["a","b","c"];var[x,y,z]=attr;console.log(x,y,z);//"a","b","c"3.默认配置varattr=["a","c"];var[x=1,y=2,z=3]=attr;console.log(x,y,z);//a2c4.占位符varattr=["a","b","c"];var[x=1,,z=3]=attr;console.log(x,z);//ac5。重命名varobj={a:1,b:2,c:"lzf"};var{a:x,c,b}=对象;console.log(x,b,c);//12"lzf"6.重命名并设置默认值varobj={a:1,b:2,c:"lzf"};var{a:x,c,b,d:z=3}=obj;console.log(x,b,c,z);//12"lzf"33.解构赋值的应用,交换值两个变量vara=1;变量b=10;[b,a]=[a,b];console.log(a,b);//1014.箭头函数arrow函数:函数的简写变体,只有一个参数省略括号,只有一个语句省略花括号和return返回对象需要用()包裹,注意没有参数不能用作构造函数this绑定示例1:使用箭头来使用函数表达式函数表示leta=function(){};a();//用箭头函数表示上面的函数表达式letfn=()=>{};fn();例子2:只有一个参数可以省略括号,没有参数可以省略或者可以省略多个参数leta=(num)=>{console.log(num);};a(1);//1//只有一个参数省略括号letfn=num=>console.log(num);fn(2);//2例3:函数体只有一条语句,返回值可以省略{}并返回leta=(a,b)=>{returna+b;};a(1,2);//3//函数体只有一条语句和返回值,省略{}和returnletfn=(a,b)=>a+b;fn(1,3);//4注意:如果返回一个对象,需要用()leta=userName=>{return{name:userName}}console.log(a("lzf"));//{name:"lzf"}//------------如果返回的是对象,需要用()包裹----------------letfn=userName=>({name:userName})console.log(fn("hzq"));//{name:"hzq"}例子4:没有参数leta=function(){console.log(arguments);};a(1,2,3,4,5);//参数(5)[1,2,3,4,5,callee:?,Symbol(Symbol.iterator):?]让fn=()=>console.log(参数);fn(1,2,3,4,5);//报错,参数未定义示例5:不能用作构造函数letfn=(a,b)=>a+b;varf=newfn();//报错,fn不是构造函数。例6:this绑定,箭头函数在声明的地方,this指向哪个letfn=()=>{console.log(this);};fn();//Windowdocument.onclick=fn;//Windowdocument.onclick=function(){setTimeout(function(){console.log(this);},500)}//Window//document.onclick=function(){//setTimeout(()=>{//console.log(this);//},500)//}//#document5.函数参数1.默认参数letadd=function(a,b,c=20){returna+b+c;};console.log(add(1,2,3));//6console.log(add(1,0,2));//3console.log(add(20,10));//502.其余参数leta=function(x,y,...r){console.log(x,y);控制台日志(r);}a("a","b","c","d");//运行结果://ab//["c","d"]letfn=(...arg)=>{console.log(arg)}fn(1,2,3,4,5)//[1,2,3,4,5]让fn1=(...arg)=>{console.log(...arg)}fn1(1,2,3,4,5)//1,2,3,4,56.展开运算符将集合变成参数形式pusharraymergearraystringconversionarrayclassarrayinto扩展数组中对象的属性。注意,如果展开内容中的item是一个对象,展开后还是一个地址引用。示例1:vararr1=[1,2,3];console.log(arr1);//[1,2,3]console.log(...arr1);//123vararr2=[1,2,31,231,23,12,3,123];console.log(Math.max(2,10));//10console.log(Math.max(...arr2));//231示例2:推送数组vararr=[1,2,3];vararr2=[4,5,6];arr.push(...arr2);console.log(arr);[1,2,3,4,5,6]示例3:合并数组vararr=[1,2,3];vararr2=[4,5,6];console.log([...arr,...arr2]);//[1,2,3,4,5,6]例4:字符串转换数组varstr="miaov";console.log(str.split(""));//["m","i","a","o","v"]console.log([...str]);//["m","i","a","o","v"]例5:扩展对象的属性扩展后仍然是地址引用varobj={arr:[1,2]}varc={name:"k",...obj}c.arr.push(3);console.log(c);//{name:"k",arr:Array(3)}console.log(obj);//{arr:Array(3)}解析地址引用方法varobj={arr:[1,2],name:"k"}//通过JSON转为字符串,再转为对象。varc=JSON.parse(JSON.stringify(obj));c.arr.push(3,4,5,);console.log(c);//{arr:Array(5),name:"k"}console.log(obj);//{arr:Array(2),name:"k"}有问题用这个方法:varobj={arr:[1,2],name:"k",fn:function(){},a:undefined,b:NaN}varc=JSON.parse(JSON.stringify(obj));c.arr.push(3,4,5);//fn,a在c,b中缺失console.log(c);//{arr:Array(5),name:"k",b:null}console.log(obj);//{arr:Array(2),名称:“k”,fn:?,a:未定义,b:NaN}
