1、let 在ES6 之前,变量声明都是使用var 但是var 作用域只有全局和局部 for(var i=0;i<2;i++){} console.log(i) 通过var 会造成一些不合理的情况 1.在循环中用于记录的变量会泄露成全局变量 2.导致代码块中的同名变量是同一个变量,即导致代码块中的变量没有独立的作用域 ES6 就提供一个 let 块级变量
var name='Tom'; if(true){ // var name='Jquery' // let 给js带来块级作用域,在let声明的变量所在的块级作用域中, //如果出现在全局变量命名相同的情况下,在块级作用域中的变量不会泄露到全局中去 let name='Jquery' } console.log('name======'+name)//var为Jquery,let为Tom let[x,y]=[1,2]; // 相当于 // let x=[1,2][0]; // let y=[1,2][1]; console.log(x,y)2、const 不能被二次赋值,会报错哦
3、箭头函数是ES6提供的一种简便编写函数的一种方式,值得注意的是,箭头函数不会改变this的指向
格式:(pare1,pare2,pare3,……)=>{函数体} 如果需要多次调用该函数,可以使用一个变量接受这个箭头函数 // var i=(function(n){ // return n+1; // })(8); // console.log(i); //上下两个下发的结果是一样的 let i=( (n)=>{return n+1} )(8); console.log(i);4、模板
// 在字符串进行拼接的时候,js使用+ // 在拼接多个数据或者多个内容的时候,容易造成拼接混乱:拼接内容包括:数据、html标签结构,变量等…… // ES6为了使拼接的结构更加清晰,使用字符模板,在字符模板中,拼接的结构内容,可以和html结构一样编写,并且在里面的空格和换行都没有任何的错误 // 使用格式:``(在键盘的数字1的左边) // 在``里面进行内容的拼接,当使用到变量的时候,${}专门用来放置字符模板的变量5、解构
// 解构 var catName='Tom'; var mouseName='Jerry'; var obj={ catName:cat, mouseName:mouse } // ES6 允许按照一定的模式,从数组或者对象中提取值直接设置,这种方式称为解构 var obj={catName,mouseName} let animal={ type:'animalType', food:'meatFood' } let{type,food}=animal; console.log(type,food) // 同 // let type=animal.type // let food=animal.food6、获取参数
function argumentFun(...types){ // 获取实参以数组方式输出 console.log(types); // 获取所有参数arguments console.log(arguments) } argumentFun('1','2','3','4');7.typeof 和 instanceof
<script> var list=[1,2,3,4]; var fun=function(){ console.log('今晚抓螃蟹去') } // typeof 查看类型 //list 是Array的一个实例化对象 console.log(typeof list); // instanceof : 判断list是不是Array的一个实例化对象 console.log(list instanceof Array)//true console.log(typeof fun) //function console.log(fun instanceof Function) // typeof 和 instanceof 的区别 // typeof 是一个元运算符,放在运算符之前,可以检测当前这个运算符的类型, //返回的是 string,object,number,function,boolean,null …… // instanceof :检查当前变量是否是对应的构造函数的一个实例对象,例如:a instanceof B // a 是不是 B 这个构造函数的一个实例化对象,如果是返回true,否则返回false </script>8、闭包,
能够读取其他函数内部变量的函数,例如在js中,只要在函数内部的子函数才能进行读取局部变量, 所以,闭包可以理解为“定义在一个函数内部的函数”,在本质上,闭包是将函数内部和函数外部连接的桥梁。 function test(){ var n=0; // 该处就是闭包的使用 function ico(){ n++; console.log(n) } return ico; } var num=test(); num();9、匿名函数
for (let i=0;i<10;i++){ //匿名函数,function() 一般而已()前面为函数名字 arr[i]=function(){ console.log(i) } } arr[2]();10、函数的复制和继承
var message={ nation:'中国', birthPlaces:['北京','河南','云南','甘肃','福建'], firend:{ name:'小林', age:18, } } // -------------浅复制------------ // original 被复制的对象 // current 我要复制到这个对象 // function extCopy(original,current){ // // 若 original 是一个对象,那么i就是属性 // // 若 original 是一个数组,那么i就是一个索引值 // for(var i in original){ // // console.log(i) // // console.log(original[i]); // // console.log(original['nation']) // current[i]=original[i]; // } // return current; // } // var obj={name:'凤姐'} // var result=extCopy(message,obj); // result.nation='美国' // console.log(result) // console.log(message) // result.firend.age=25; // result.birthPlaces.push('台湾') // console.log(result) // console.log(message) // 浅复制出现问题 // 修改复制好的对象中的某些值,会将原先对象中对应的值也修改 // 因为:这里的result和message中的属性birthPlaces和firend都是指向同一个内存地址(内层、堆), //改变一个会影响到另一个的属性值,而直接存储值(外层)的属性没有这样的影响(栈) // 怎么样才能让内层和外层一样? // 怎么做到深复制? // -----------------------深复制------------------------- function extCopy2(original,current){ // 先遍历我要复制的对象 for(var i in original){ if(typeof original[i]=='object'){ // 条件成立,表示改项为对象 // 要进行特殊处理,深复制 if(original[i].constructor===Array){ // 说明该属性的值是一个数组 current[i]=[]; }else{ // 说明是对象 current[i]={}; } extCopy2(original[i],current[i]);//递归 }else{ current[i]=original[i] } } return current; } var obj={}; var res=extCopy2(message,obj); res.birthPlaces.push('台湾') console.log(res); console.log(message);