一、let和const关键字
let和const关键字是用来定义变量的。在此之前,我们定义js变量使用的是“var”关键字。“var”关键字会导致一个问题,就是其定义的变量有时候会莫名变成全局变量。
我们创建一个index.html文件,写下如下代码:
<!DOCTYPE html>
<html>
<head>
<title>TEST ES6</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<script>
for(var i=0;i<5;i++){
console.log(i);
}
console.log("循环外:"+i);
</script>
</body>
</html>
使用谷歌浏览器打开该网页,按F12打开控制台,可以看到该js运行的结果为:
可以看到循环外的i也是5,这显然是不对的,i是循环内的字段,在循环外应该是看不到或者是未定义的,而这种情况在ES5和之前基本上经常会遇到。
为了解决上面的问题,ES6出现了let和const关键字,
1、let关键字
let定义的变量为“局部变量”,其定义的变量只在其所在的代码块生效。例如上面的例子我们将js代码修改为:
for(let i=0;i<5;i++){
onsole.log(i);
}
console.log("循环外:"+i);
效果:
可以看到,i在循环内显示无误,在循环外由于i是局部变量,所以在外部不存在。
2、const关键字
const是“constants”的缩写,即“常数、常量”。用const定义的数据,被视为常量,是不允许被修改的(类似Java中的Final关键字)。
例如:
const num = 1;
console.log(num++);
结果:
该报错的意思是,const定义了变量,且该变量存在初始值(这里已经给num定义了1这个初始值)。
以后我们在js代码中,尽量不再出现var关键字了,以防止一些不必要的逻辑问题出现。
二、解构表达式
“解构表达式”的意思就是,用来解析对象的结构的表达式,它可以快速的实现结构解析和重新封装。
1、解构数组
我们通过一个实例来说明其效果,例如目前有一个数组:
let arr=[1,2,3];
我们如果要相应数组的值,只能通过角标一个一个显示,如:
let arr=[1,2,3];
console.log(arr[0],arr[1],arr[2]);
效果:
在ES6中,我们就可以使用下面的方式来直接获取数组的值:
let arr=[1,2,3];
let [x,y,z]=arr;//x,y,z将与arr中的每个位置对应来取值
console.log(x,y,z);
效果:
这里的“const[x,y,z]”与“arr”将会进行结构的对比,程序会发现右侧的arr是一个数组,而左侧有三个变量x,y,z,这里保持两边结构相近的原则下,就会将arr数组的前3个值赋值给x,y,z。
这样我们可以举一反三,如果我们仅需要取出第2和第3个元素,可以这样写:
let arr=[1,2,3];
let [,x,y]=arr;
console.log(x,y);
效果:
或者取出除了第一个元素的所有元素:
let arr=[1,2,3];
let [,...arr2]=arr;
console.log(arr2);
效果:
2、解构对象
除了能解析数组,它还能解析对象,例如下面的例子,传统的取出对象属性的方式:
let p={name:"jack",age:21};
let name = p.name;
let age = p.age;
使用解构表达式,可以这样写:
let p={name:"jack",age:21};
let {name,age} = p;
需要注意的是,像p这种没有索引位置的对象(数组有索引位置),左侧定义的变量名称一定要是p中属性的名字,因为对象中的属性是无序的。如果我们非要给它起别名,可以这样设置:
let {name:x,age:y} = p;
这样就会取出name和age,分别赋值给变量x和y。
上面是一个简单的对象,解构表达式同样支持复杂的对象。
let p={name:"jack",age:21,girl:{name:"rose",age:18}};
let {girl:{name}} = p;
这里使用了双重解构,即解构了p中的girl属性后,有解析girl的name属性。
将整个p对象赋值为一个新的变量,可以这样写:
let {...obj}=p;
这里即是将p中的所有属性赋值给了obj,这是对象的一种深层拷贝,而不是简单的索引指向同一个变量,obj和p对象是不相等的:
在数据量比较小的情况下,这样的取数方式比原来直接取下标值会轻松许多。
三、函数优化
1、函数简写
ES6可以对函数的写法进行简写优化,例如:
var print = function(obj){
console.log(obj);
}
//可以简写为
const add = obj => console.log(obj);
类似于Java的lambda表达式。
多个参数时:
var sum = function(a,b){
return a+b;
}
//可以简写为
const sum2 = (a,b) => a+b;
效果:
如果代码不止一行,可以使用花括号括起来:
const sum3 = (a,b) => {
return a+b;
}
2、对象优化
例如我们定义一个JS对象,里面还包含一个方法:
const p = {
name:"jack",
age: 21,
sayHello: function (){
console.log("Hello");
}
};
p.sayHello();
在ES6中我们可以将对象中的方法“: function ”删除,如下:
const p = {
name:"jack",
age: 21,
sayHello(){
console.log("Hello");
}
};
另外,我们可以在定义对象的时候,其函数内部同样可以使用解构表达式。例如下面的函数:
const hello = function(person){
console.log(person.name,person.age);
}
这里我们可以在参数上面,直接解构需要的参数即可,然后再用=>简化,最终效果:
const hello = ({name,age}) => console.log(name,age);
结果:
四、map和reduce
在ES6中,数组新增了map和reduce方法。
1、map方法
map():接收一个函数,将原数组中所有元素用这个函数处理后放入新数组返回。
例如:
let arr = ['5','-33','2','7'];
console.log(arr);
arr = arr.map(a => parseInt(a));
console.log(arr);
该map就将实现了将数组中所有的字符串类型,全部转换成int格式,效果:
map中的“a”就代指数组中的每一个元素,其“=>”后面就是该参数的处理逻辑(和函数简写一样,如果有多行,就使用“{}”)。
2、reduce方法
reduce():接受一个函数(必须)和一个初始值(可选),该函数接收两个参数:
● 第一个参数是上一次reduce处理的结果
● 第二个参数是数组中要处理的下一个元素
reduce()会从左到右依次把数组中的元素用reduce处理,并把处理的结果作为下次reduce的第一个参数。如果是第一次,会把前两个元素作为计算参数,或者把用户指定的初始值作为起始参数。
例如:
let arr2 = [5,-33,2,7];
arr2.reduce((a,b) => a+b) ;
上面的逻辑就是,求出arr数组的和(第一个元素加第二个元素,作为下一轮的第一个元素,依次计算完毕后,就得到arr数组的累加值)。效果:
参考:乐优商城教学视频-ES6部分(52studyit.com提供)
转载请注明出处:https://blog.csdn.net/acmman/article/details/114223155