es6语法新特性-笔记

ES6新特性笔记

1.ES5和6的一些新特性

我们这里只把一些常用的进行学习,更详细的大家参考:

阮一峰的ES6教程

1.1 let 和 const 命令

1.1.1var

之前,js定义变量只有一个关键字:var

var有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。

例如这样的一段代码:

for(var i = 0; i < 5; i++){
    console.log(i);
}
console.log("循环外:" + i)
1.1.2 let

let所声明的变量,只在let命令所在的代码块内有效。

我们把刚才的var改成let试试:

for(let i = 0; i < 5; i++){
    console.log(i);
}
console.log("循环外:" + i)

在这里插入图片描述

1.1.3const

const声明的变量是常量,不能被修改

在这里插入图片描述

2.1.字符串扩展

2.1.1新的API

ES6为字符串扩展了几个新的API:

  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。

实验一下:
在这里插入图片描述

2.1.2字符串模板

ES6中提供了" ` "来作为字符串模板标记。我们可以这么玩:

在这里插入图片描述

在两个`之间的部分都会被作为字符串的值,不管你任意换行,甚至加入js脚本

3.1.解构表达式

3.1.1数组解构

比如有一个数组:

let arr = [1,2,3]

我想获取其中的值,只能通过角标。ES6可以这样:

const [x,y,z] = arr;// x,y,z将与arr中的每个位置对应来取值
// 然后打印
console.log(x,y,z);
结果:

在这里插入图片描述

3.1.2对象解构

例如有个person对象:

const person = {
    name:"jack",
    age:21,
    language: ['java','js','css']
}

我们可以这么做:

// 解构表达式获取值
const {name,age,language} = person;
// 打印
console.log(name);
console.log(age);
console.log(language);

结果:

在这里插入图片描述

如过想要用其它变量接收,需要额外指定别名:

在这里插入图片描述

{name:n}:name是person中的属性名,冒号后面的n是解构后要赋值给的变量。

4.1.函数优化

4.1.1函数参数默认值

在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法:

    function add(a , b) {
        // 判断b是否为空,为空就给默认值1
        b = b || 1;
        return a + b;
    }
    // 传一个参数
    console.log(add(10));

现在可以这么写:

function add(a , b = 1) {
    return a + b;
}
// 传一个参数
console.log(add(10));
4.1.2箭头函数

ES6中定义函数的简写方式:

一个参数时:

var print = function (obj) {
    console.log(obj);
}
// 简写为:
var print2 = obj => console.log(obj);

多个参数:

// 两个参数的情况:
var sum = function (a , b) {
    return a + b;
}
// 简写为:
var sum2 = (a,b) => a+b;

代码不止一行,可以用{}括起来

var sum3 = (a,b) => {
    return a + b;
}
4.1.3对象的函数属性简写

比如一个Person对象,里面有eat方法:

let person = {
    name: "jack",
    // 以前:
    eat: function (food) {
        console.log(this.name + "在吃" + food);
    },
    // 箭头函数版:
    eat2: food => console.log(person.name + "在吃" + food),// 这里拿不到this
    // 简写版:
    eat3(food){
        console.log(this.name + "在吃" + food);
    }
}
4.1.4箭头函数结合解构表达式

比如有一个函数:

const person = {
    name:"jack",
    age:21,
    language: ['java','js','css']
}

function hello(person) {
    console.log("hello," + person.name)
}

如果用箭头函数和解构表达式

var hi = ({name}) =>  console.log("hello," + name);

5.1.map和reduce

数组中新增了map和reduce方法。
5.1.1map

map():接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回。

举例:有一个字符串数组,我们希望转为int数组

let arr = ['1','20','-5','3'];
console.log(arr)

arr = arr.map(s => parseInt(s));
console.log(arr)

在这里插入图片描述

5.1.2reduce

reduce():接收一个函数(必须)和一个初始值(可选)。

第一个参数(函数)接收两个参数:

  • 第一个参数是上一次reduce处理的结果
  • 第二个参数是数组中要处理的下一个元素

reduce()会从左到右依次把数组中的元素用reduce处理,并把处理的结果作为下次reduce的第一个参数。如果是第一次,会把前两个元素作为计算参数,或者把用户指定的初始值作为起始参数

举例:

const arr = [1,20,-5,3]

没有初始值:

在这里插入图片描述

指定初始值:

在这里插入图片描述

6.1.对象扩展

ES6给Object拓展了许多新的方法,如:

  • keys(obj):获取对象的所有key形成的数组
  • values(obj):获取对象的所有value形成的数组
  • entries(obj):获取对象的所有key和value形成的二维数组。格式:[[k1,v1],[k2,v2],...]
  • assign(dest, …src) :将多个src对象的值 拷贝到 dest中(浅拷贝)。

在这里插入图片描述

7.1.数组扩展

ES6给数组新增了许多方法:

  • find(callback):数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。
  • findIndex(callback):数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
  • includes(数组元素):与find类似,如果匹配到元素,则返回true,代表找到了。

8.1.Promise

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法
上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样
的方法进行处理。
我们可以通过Promise的构造函数来创建Promise对象,并在内部封装一个异步执行的结果。

<script>
    const p = new Promise((resolve, reject) => {
        //写异步操作,通常是ajax的操作
        setTimeout(()=>{
            //异步操作,模拟操作
            let num = Math.random();
            if (num < 0.5) {
                //认为成功
                resolve("成功了" + num);
            } else {
                //认为失败
                reject("失败了" + num)
            }
        });
    });

    console.log("ok1");
    p.then(value => {
        //调用成功
        console.log(value);
    }).catch(reason => {
        //调用失败
        console.log(reason);
    })

    console.log("ok2");
</script>

结果:
在这里插入图片描述
在这里插入图片描述

9.1 set和map

9.1.1 set 集合

ES6提供了Set和Map的数据结构。
Set,本质与数组类似。不同在于Set中只能保存不同元素,如果元素相同会被忽略。和java中的Set集合非常相似。
构造函数:

// Set构造函数可以接收一个数组或空
let set = new Set();
set.add(1);// [1]
// 接收数组
let set2 = new Set([2,3,4,5,5]);// 得到[2,3,4,5]

方法:

set.add(1);// 添加
set.clear();// 清空
set.delete(2);// 删除指定元素
set.has(2); // 判断是否存在
set.forEach(value => {
	console.log(value);
})//遍历元素
set.size; // 元素个数。是属性,不是方法。
9.1.2 map

map,本质是与Object类似的结构。不同在于,Object强制规定key只能是字符串。而Map结构的key可以是任意对
象。即:
object是 <string,object>集合
map是<object,object>集合

构造函数:

// map接收一个数组,数组中的元素是键值对数组
const map = new Map([
['key1','value1'],
['key2','value2'],
])
// 或者接收一个set
const set = new Set([
['key1','value1'],
['key2','value2'],
])
const map2 = new Map(set)
// 或者其它map
const map3 = new Map(map);

方法:

map.get("key1");//获取指定key的value
map.set(key, value);// 添加
map.clear();// 清空
map.delete(key);// 删除指定元素
map.has(key); // 判断是否存在
map.forEach(function(key,value){})//遍历元素
map.forEach((value,key) => {
	//注意value在前
})//遍历元素
map.size; // 元素个数。是属性,不是方 法
map.values() //获取value的迭代器
map.keys() //获取key的迭代器
map.entries() //获取entry的迭代器
用法:
for (let key of map.keys()) {
console.log(key);
}
或:
console.log(...map.values()); //通过扩展运算符进行展开

10.class(类)的基本语法

10.1.基本语法
<script>
    class User{
        constructor(name, age = 20){ // 构造方法
            this.name = name; // 添加属性并且赋值
            this.age = age;
        }
        sayHello(){ // 定义方法
            return "hello";
        }
        static isAdult(age){ //静态方法
            if(age >= 18){
                return "成年人";
            }
            return "未成年人";
        }
    }
    let user = new User("张三");
    // 测试
    console.log(user); // User {name: "张三", age: 20}
    console.log(user.sayHello()); // hello
    console.log(User.isAdult(20)); // 成年人

</script>
10.2 类的继承
<script>
    class User {
        constructor(name, age = 20) { // 构造方法
            this.name = name; // 添加属性并且赋值
            this.age = age;
        }

        sayHello() {
            return "hello"; // 定义方法
        }

        static isAdult(age) { //静态方法
            if (age >= 18) {
                return "成年人";
            }
            return "未成年人";
        }
    }

    class ZhangSan extends User {
        constructor() {
            super("张三", 30); //如果父类中的构造方法有参数,那么子类必须通过super调用父类的构造
            方法
            this.address = "上海";//设置子类中的属性,位置必须处于super下面
        }
    }

    // 测试
    let zs = new ZhangSan();
    console.log(zs.name, zs.address);
    console.log(zs.sayHello());
    console.log(ZhangSan.isAdult(20));
</script>

11.Generator函数

Generator 函数是 ES6 提供的 一种异步编程解决方案,语法行为与传统函数完全不同 。
Generator函数有两个特征: 一是 function命令与函数名 之间有一个星号: 二是 函数体内部使用 yield语句定义不同的内部状态。

用法:

<script>
function* hello () {
yield "hello";
yield "world";
return "done";
}
let h = hello();
console.log(h.next()); //{value: "hello", done: false}
console.log(h.next()); //{value: "world", done: false}
console.log(h.next()); //{value: "done", done: true}
console.log(h.next()); //{value: undefined, done: true}
</script>

可以看到,通过hello()返回的h对象,每调用一次next()方法返回一个对象,该对象包含了value值和done状态。直到
遇到return关键字或者函数执行完毕,这个时候返回的状态为ture,表示已经执行结束了

for of 可以循环遍历Generator 函数返回的迭代器
<script>
	function* hello () {
		yield "hello";
		yield "world";
		return "done";
	}
	let h = hello();
	for (let obj of h) {
	console.log(obj);
	}
</script>
// 输出:
hello
world

12. 修饰器(Decorator)

修饰器(Decorator)是一个函数, 用来修改类的行为。 ES2017 引入了这项功能, 目前 Babel 转码器己经支持。
使用:

<script>
	@T //通过@符号进行引用该方法,类似java中的注解
	class User {
		constructor(name, age = 20){
		this.name = name;
		this.age = age;
		}
	}
	function T(target) { //定义一个普通的方法
		console.log(target); //target对象为修饰的目标对象,这里是User对象
		target.country = "中国"; //为User类添加一个静态属性country
		}
	console.log(User.country); //打印出country属性值
</script>

运行报错:
在这里插入图片描述

原因是,在ES6中,并没有支持该用法,在ES2017中才有,所以我们不能直接运行了,需要进行编码后再运行。
转码的意思是:将ES6或ES2017转为ES5执行。类似这样:

//转码前
input .map(item =>item + 1);
//转码后
input.map(function (item) {
return item + 1;
})

13.转码器UmiJS

#首先,需要安装Node.js
#在资料中,找到node-v8.12.0-x64.msi,一路下一步安装
#安装完成后,通过node -v 命令查看其版本号
F:\code\itcast-es6>node -v
v8.12.0
#接下来,开始安装yarn,其中tyarn使用的是npm.taobao.org的源,速度要快一些
#可以把yarn看做了优化了的npm
npm i yarn tyarn -g #-g 是指全局安装
tyarn -v #进行测试,如果能够正常输出版本信息则说明安装成功了
#如果安装失败,是由于将yarn添加到环境变量中导致,参见
http://www.easysb.cn/index.php/2017/06/04/11/
#下面开始安装umi
tyarn global add umi
umi #进行测试
快速入门
#通过初始化命令将生成package.json文件,它是 NodeJS 约定的用来存放项目的信息和配置等信息的文件。
tyarn init -y
#通过umi命令创建index.js文件
umi g page index #可以看到在pages下创建好了index.js和index.css文件
#将下面内存拷贝到index.js文件中进行测试
@T //通过@符号进行引用该方法,类似java中的注解
	class User {
	constructor(name, age = 20){
		this.name = name;
		this.age = age;
	}
}
	function T(target) { //定义一个普通的方法
	console.log(target); //target对象为修饰的目标对象,这里是User对象
	target.country = "中国"; //为User类添加一个静态属性country
}
	console.log(User.country); //打印出country属性值
#通过命令行启动umi的后台服务,用于本地开发
	umi dev
#通过浏览器进行访问:http://localhost:8000/,查看效果
#值得注意的是,这里访问的是umi的后台服务,不是idea提供的服务

14.模块化

模块化就是把代码进行拆分,方便重复利用。类似java中的导包:要使用一个包,必须先导包。
而JS中没有包的概念,换来的是 模块。
模块功能主要由两个命令构成: export 和 import 。

  • export 命令用于规定模块的对外接口,
  • import 命令用于导入其他模块提供的功能。
14.1.export

定义一个js文件:Util.js,里面有一个Util类:

class Util {
static sum = (a, b) => a + b;
}
//导出该类
export default Util;
14.2.import

使用 export 命令定义了模块的对外接口以后,其他 JS 文件就可以通过 import 命令加载这个模块。
例如我要使用上面导出的Util:

//Index.js
//导入Util类
import Util from './Util'
//使用Util中的sum方法
console.log(Util.sum(1, 2));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值