关于ES6新特性
- 块级作用域(let声明)
let声明的变量不存在提升,不允许反复声明
在块级作用域下使用let声明的变量是局部变量,不能被其他作用域访问到
注意:if,else,while,for…所有大括号中都是块级作用域
- 函数增强
- 参数默认值(default)
即使调用函数时没有传入实参值,对应的形参变量也有默认值可用
function 函数名(形参1,形参2,形参n=默认值){
}
- 剩余参数(rest)
专门代替arguments来解决不确定实参值个数的问题
因为arguments是类数组,并非数组,所以不能使用数组家的函数
ES6箭头函数禁止使用arguments
定义函数时,…会自动收集除前几个形参变量外剩余的所有实参值
function 函数名(形参1,形参2,...自定义数组名){
//收集的所有实参值,都自动放在自定义数组中
}
举例:
var add = (...arr)=>arr.reduce((box,elem)=>box+elem,0);
console.log(add(1,2,3));
function jisuan(ename,...arr){
var sum = arr.reduce((box,elem)=>box+elem,0);
console.log(`${ename}的总工资是${sum}`);
}
jisuan("韩梅",6000,300,900);
- 打散数组(speard)
专门将一个数组或对象整体打散为多个值,再使用
函数名(...数组名)
举例:
var arr=[1,5,6,8];
console.log(Math.max(...arr));
总结:定义函数时,用…收集;调用函数时,用…打散
…的语法糖:
复制一个数组:var arr2 = […arr1];
拼接两个数组以及其他元素:var arr3 = [元素1,…arr1,元素n,…arr2];
复制一个对象(clone):var obj2 = {…obj1};
拼接多个对象以及属性:var obj3 = {属性1:值1,…obj1,属性n:值n,…obj2};
- 箭头函数
简化了匿名函数的写法,但不等价于匿名函数
//普通函数
function sort(a,b){
return a-b;
}
//箭头函数
sort((a,b)=>{return a-b;})
//再简化
sort((a,b)=>a,b);
- 箭头函数的特点:
(1)内外this保持一致,但不是所有的function都可以使用箭头函数
(2)对象内的函数不能使用箭头函数,ES6提供了简写:函数内部使用箭头函数
举例:
var Hanmeimei = {
sname:"Hanmeimei",
friends:["小米","小曼","小明"],
intr:function(){
this.friends.forEach(
elem=>{
console.log(`${this.sname}认识${elem}`)
});
}
};
Hanmeimei.intr();
原理:
当对象内的函数使用箭头函数后,因为对象没有作用域,intr()直接指向window,所以forEach的this直接指向window,再打印时,会undefined,因为全局中没有friends
- 模板字符串
`我最喜欢的小说是:${js表达式(任何形式的数据)}`
注意:
可以写:
变量, 算数计算, 各种有返回值的运算,三目,
有返回值的函数调用,创建对象,访问数组元素
不可以写:
模板字符串中不可以写任何结构分支