【JavaScript的ES6语法】2、ES6语法学习(let和const、解构表达式、函数优化、map和reduce)

一、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

Guess you like

Origin blog.csdn.net/u013517797/article/details/114223155