前言

复习时使用,希望可以帮到自己,也可以帮到大家。

ECMA相关介绍

ECMA为欧洲计算机制造商协会,这个组织的目的是评估、开发和认可电信和计算机标准。1994年后该组织改名为Ecma国际。

1.1 什么是ECMAScript

ECMAScript是由Ecma国际通过ECMA-262标准化的脚本程序设计语言。

1.2 什么是ECMA-262

Ecma国际制定了许多标准,而ECMA只是其中的一个,所有标准列表有兴趣可以去查看https://www.ecma-international.org/publications/stands/Standard.htm,如下。

1.3 ES6相关历史

1.4 谁在维护ECMA-262

TC39是推进ECMAScript发展的委员会。其会员都是公司(主要是浏览器厂商,比如谷歌、苹果、微软、因特尔等)。TC39定期召开会议,会议由会员公司的代表与特邀专家出席。

1.5 为什么要学习ES6

  • ES6版本变动内容最多,具有里程碑;
  • 加入许多新语法特性,编程实现更简单、高效;
  • 是前端发展趋势,就业必备技能;

二.let和const变量声明及相关特性

2.1 let变量及相关特性

2.1声明格式与var一样:

let a;
let b,c,d;
let e= 100;
let f = 521,g = 'love';

2.2特性

  1. 变量不能重复声明
let star = '吴亦凡';
let star = '加拿大电鳗';

会出现如下类型的错误:

  1. 块级作用域 全局,函数,eval
{let girl="zhou";
}
console.log(girl);
//此时不能打印成功,因为girl这个变量只作用在花括号那一块,所以不能打印;
//即只在所属块的作用域里有效;
  1. 不存在变量提升
console.log(song);
let song = 'let me love you';

出现如下的错误:
表示不允许在声明之前去使用这个变量

  1. 不影响作用域链
{let school = "xu";function fn() {console.log(school);}fn();
}

打印成功:
![在这里插入图片描述](https://img-blog.csdnimg.cn/93cd2d41a7b5443096f80ff6f646158d

const变量

2.1声明和var和let是一样的;
2.2相关特性

  • 一定要初始化值;
const A;

出现如下错误:

  • 一般常量使用大写(此处是潜规则,小写也不出错)
  • 常量的值不能修改
const SCHOOL = 'sc';
SCHOOL = 'ATGUIGU';

会出现如下错误:

  • 块级作用域;
  • 对于数组和对象的元素修改,不算做对常量的修改,不会报错;
    因为常量所指向的地址没有变化,所以不会报错

三.ES6解构赋值

ES6 允许按照一定模式从数组和对象 中提取,对变量进行赋值,这被称为解构解析。

3.1 数组的解构

cosnt f4 = ['刘德华','张学友','黎明','郭富城'];
let [l,z,li,g] = f4;
console.log(l);
console.log(z);
console.log(li);
console.log(g);

运行结果如下:

3.2 对象的解构(方法频繁调用时可使用)

 const hu = {name: '胡歌',age: '四十大几',yanxi: function() {console.log('我可以演戏');}};let {name,age,yanxi} = hu;console.log(name);console.log(age);console.log(yanxi);yanxi();

运行结果如下:

四.模板字符串及简化对象写法

4.1模板字符串

4.1.1 声明

     let str = `字符串`;//不知道有没有人和我一样,不知道怎么打出反引号,是键盘数字1旁边的那个 console.log(str, typeof str);

运行结果:

4.1.2 特性

  • 内容可以直接出现换行符
let str = `<ul><li>张</li><li>李</li></ul>`;
  • 可在字符串进行换行或者拼接的地方使用
  • 可以进行变量拼接
     let lov = '贾玲';let out = `${lov}是我喜欢的喜剧演员`;console.log(out);

运行结果:

4.2简化对象写法

 let name = 'zhoushen';let sing = function() {console.log('达拉崩吧!');}const jieshao = {name,//简化属性的写法,之前为name:name,sing,//简化函数的写法// improve:function() {//     cosnole.log('达拉崩吧斑得贝迪');// }improve() {cosnole.log('达拉崩吧斑得贝迪')}}console.log(jieshao);

运行结果如下:

五.箭头函数

5.1 声明

let fn = (a, b) => {return a + b;}//调用函数let result = fn(1, 2);console.log(result);

5.2 声明特点

  • this是静态的,this始终指向函数声明时所在作用域下的this值
        function getName() {console.log(this.name);}let getName2 = () => {console.log(this.name);}// 设置window对象的name属性window.name = 'www';const school = {name: 'AWWW',}// 直接调用getName(); //this值指向windowgetName2(); //在全局作用域下声明,this值也是指向window// call调用getName.call(school); //this所指发生了改变getName2.call(school); //箭头函数依然指向window

运行结果如下:
可以看出使用call调用的时候,箭头函数的this并没有发生改变,无论使用什么方法去调用,this始终指向函数在声明时作用域下的this值

  • 不能作为构造函数,实例化对象
 let Person = (name,age) => {this.name = name;this.age = age;}let me = new Person ('xiao',30);console.log(me);

运行结果如下:

  • 不能使用arguments变量
let fn = () => {console.log(arguments);}fn(1, 2, 3);

运行出现错误:

  • 箭头函数的简写
// 当形参只有一个的时候,省略小括号let add = n => {return n + n;//省略花括号。当代码体只有一条语句的时候,此时return必须省略,而且语句的执行结果就是函数的返回值
// let pow = (n) => {//     return n*n;
// }let pow = n => n * n;console.log(pow(9));

现在我们来举个栗子来更好的理解箭头函数:

 <div id="ad"></div><script>let ad = document.getElementById('ad');//绑定事件ad.addEventListener("click", function() {//let _this = this;//一般函数时,如果没有这个值来保存this值,则会出错,//this指向Window,而window没有style属性,所以出错  setTimeout(() => { //如果使用箭头函数,this此时是静态值,指向函数声明时所在作用域的this值this.style.background = 'pink';}, 2000);});</script>

数组的返回:

 const arr = [1, 6, 9, 100, 10, 25];//一般函数const result = arr.filter(function(item) {if (item % 2 === 0) {return true;} else {return false;}});//箭头函数const result = arr.filter(item => item % 2 === 0);console.log(result);

六.其他特性

6.1函数参数的默认值设置

ES6允许给函数参数赋值初始值

6.1.1 形参初始值 具有默认值得参数,一般位置要靠后(同样是潜规则啦)

function add(a, b, c = 10) {return a + b + c;}let result = add(1, 2);console.log(result);          //13

6.1.2 与解构赋值结合使用

 function connect({host = '127.0.0.1',//如果connect传有 参数,则使用connect的参数,如果没有,则使用我们设置的默认值username,password,port}) {console.log(host);console.log(username);console.log(password);console.log(port);}connect({host: 'localhost',username: 'root',password: 'root',port: 3308})

6.2 rest参数

引入rest参数,用于获取函数的实参,用来代替arguments

首先我们来看看ES5获取实参的方法

function date() {console.log(arguments);}date('白芷', '胡歌', '周星星');   //Arguments(3)

返回结果:

返回的是一个对象
0: “白芷”
1: “胡歌”
2: “周星星”
callee: ƒ date()
length: 3
Symbol(Symbol.iterator): ƒ values()
proto: Object

ES6:

function date(...args) {//放在了形参里面,而下一个的扩展运算符则是放在了调用的实参里面console.log(args);//filter some every map}date('白芷', '胡歌', '周星星');

返回的是一个数组:

[“白芷”, “胡歌”, “周星星”]
0: “白芷”
1: “胡歌”
2: “周星星”
length: 3
proto: Array(0)

rest参数必须要放到参数最后:

function fn(a,b,...args) {console.log(a);     //1console.log(b);     //2console.log(args);     //[3,4,5,6]
}
fn(1,2,3,4,5,6);//如果写成function fn(a,...args,b){}
//则会出现错误如下:
//Uncaught SyntaxError: Rest parameter must be last formal parameter

6.3 扩展运算符

6.3.1 扩展运算符的介绍

扩展运算符能将数组转换为逗号分隔的参数序列

 const tf = ['易烊千玺','王源','王俊凯'];function chunwan() {console.log(arguments);}chunwan(...tf);//如果只写入tf//chunwan(tf);//返回结果是://0: (3) ["易烊千玺", "王源", "王俊凯"]//callee: ƒ chunwan()//length: 1//Symbol(Symbol.iterator): ƒ values()//__proto__: Object

结果如下:

Arguments(3)
0: “易烊千玺”
1: “王源”
2: “王俊凯”
callee: ƒ chunwan()
length: 3
Symbol(Symbol.iterator): ƒ values()
proto: Object

6.3.2 扩展运算符的应用

  • 数组的合并
 const kuaizi = ['王太利', '肖央'];const fenghuang = ['曾毅', '玲花'];const zuixuanxiaopg = [...kuaizi, ...fenghuang];console.log(zuixuanxiaopg);     //["王太利","肖央","曾毅","玲花"]
  • 数组的克隆
 const sanzhihua = ['E', 'G', 'M'];const sanyecao = [...sanzhihua];console.log(sanyecao);     //(3) ["E", "G", "M"]
  • 将伪数组转为真正的数组
const divs = document.querySelectorAll('div');const divArr = [...divs];console.log(divArr);    //(3) [div, div, div],此时变成了一个真正的数组

6.4 Symbol

Symbol 是ES6引入的一种新的原始数据类型,表示独一无二的值。是一种类似于字符串的值

6.4.1 特点

1.Symbol的值是唯一的 ,用来解决命名冲突的问题
2.Symbol值不能与其他数据进行运算
3.Symbol定义的对象属性不能使用for…in 循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名

6.4.2 Symbol的创建

  • 创建Symbol:
let s = Symbol();let s2 = Symbol("zs");let s3 = Symbol("zs");console.log(s2 === s3);     //false//false可以理解为s2和s3虽然值一样,但是他们的编号不同,所以错误
  • Symbol.for创建:
let s4 = Symbol.for('sg');let s5 = Symbol.for('sg');console.log(s4 === s5);   //true

6.4.3 Symbol的注意事项

  • 不能与其他数据进行运算
 let s = Symbol();let result = s + 100;

结果出现如下错误:

Uncaught TypeError: Cannot convert a Symbol value to a number

  • 对象添加Symbol类型的属性:
let game = {};let methods = {up: Symbol(),down: Symbol()};game[methods.up] = function() {console.log("下降");}game[methods.down] = function() {console.log("上升");}console.log(game);
  • Symbol内置值

Symbol内置值是Symbol的属性,而Symbol和它的内置值,可以作为对象和数组的属性来使用,具体如下:

//1.class Person {static[Symbol.hasInstance](param) {console.log(param);console.log("wobeiyonglaijiance ");}}let o = {};console.log(o instanceof Person); //检测这个值是否是该对象的实例
//2.
const arr = [1, 2, 3];const arr2 = [4, 5, 6];arr2[Symbol.isConcatSpreadable] = false; //控制数组在进行合并时,是否可以展开console.log(arr.concat(arr2));

6.5 迭代器

迭代器是一种接口,为各种不同的数据结构提供统一的访问机制,任何数据只要部署Iterator接口,就可以完成遍历操作。

ES6创造了一种新的遍历命令for…of循环,Iterator接口主要供for…of消费
原生具备Iterator接口的数据有:Array、Arguments、Set、Map、String、TypeArray、NodeList

工作原理:

1.创建一个指针对象,指向当前数据结构的起始位置;
2.第一次调用对象的next方法,指针自动指向数据结构的第一个成员
3.接下来不断调用next方法,指针一直在往后移动,一直到指向最后一个成员
4.每调用方法返回一个包含value和done属性的对象

const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧'];
let iterator = xiyou[Symbol.iterator]();console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());

自定义遍历数据:

//使用for...of来遍历banji里stus的值
const banji = {name: "zjyb",stus: ['xiaoming','xiaoning','xiaotian','night'],[Symbol.iterator]() {let index = 0;let _this = this;return {next: function() {if (index < _this.stus.length) {const result = {value: _this.stus[index],done: false};index++;return result;} else {return {value: undefined,done: true}}}};}}for (let v of banji) {console.log(v);}

结果:

6.6生成器函数

生成器函数是ES6提供的一种异步编程解决方案,语言行为与传统函数完全不同
异步编程:文件操作、网络操作(AJAX,request)、数据库操作

6.6.1生成器函数声明及调用:

function* gen() {console.log('hello ');}let iterator = gen();// console.log(iterator);直接调用并不能成功,而需要使用next方法调用iterator.next();              //hello
// yield:
function* gen() {console.log(111);yield 'meiyouerduo';//函数代码的分隔符,即分段的作用console.log(222);yield 'meiyouweiba';console.log(333);yield 'zhenqiguai';console.log(444);}let iterator = gen();iterator.next();          //111//若只调用一次next,则只打印111,而不是像传统函数一样全部打印//遍历for (let v of gen()) {console.log(v);}

6.6.2生成函数参数

function* gen(arg) {console.log(arg);     //AAAlet one = yield 111;console.log(one);     //BBBlet two = yield 222;console.log(two);     //CCClet three = yield 333;console.log(three);   //DDD}let iterator = gen('AAA');console.log(iterator.next()); //next方法可以传入实参,传入的实参就是yield语句的返回结果//第一次调用返回传入函数的实参console.log(iterator.next('BBB')); //第二次传入的实参会作为第一个yield语句的整个返回结果console.log(iterator.next('CCC'));//第三次传入的实参会作为第二个yield语句的整个返回结果console.log(iterator.next('DDD'));//即next传入的实参会作为上一个yield语句的返回结果

6.6.3实例
1.获取数据

//2模拟获取 用户数据 订单数据 商品数据function getUsers() {setTimeout(() => {let data = '用户数据';iterator.next(data);}, 1000);}function getOrders() {setTimeout(() => {let data = '订单数据';iterator.next(data);}, 1000);}function getGoods() {setTimeout(() => {let data = '商品数据';iterator.next(data);}, 1000);}function* gen() {let users = yield getUsers();console.log(users);let orders = yield getOrders();console.log(orders);let goods = yield getGoods();console.log(goods);}let iterator = gen();iterator.next();

结果:

2.解决回调地狱

// 1s后控制台输出 111 2s后输出222 3s后输出333//      回调地狱:不停回调function one() {setTimeout(()=>{console.log(111);   //111iterator.next();},1000);}function two() {setTimeout(()=>{console.log(222);   //222iterator.next();},2000);}function three() {setTimeout(()=>{console.log(333);   //333iterator.next();},3000);}function * gen() {yield one();yield two();yield three();}let iterator = gen();iterator.next();

总结

这是第一部分,后面的知识会在几天后发出,我们一起探讨学习啊,如果有错误,也请多多指出啦~

ES6之你应该知道的知识(一)相关推荐

  1. 一次性搞定JavaScript 从 ES6 到 ES12的基础框架知识

    Javascript 是前端三剑客技术最重要的技能之一.每个学习前端的人,这个JavaScript技术是必须要学的.随着技术不断更新迭代,所以现在有一些新的知识来支持我们去学习 ES6 ~ ES12. ...

  2. es6去除重复项_ES6 常用知识总结

    一.ES6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来 ...

  3. es6中类的使用、及其转es5源码解析

    文章目录 前言 一.es6中的类 1.类的定义 2.类的构造方法.方法定义和实现继承 1.类的构造方法 2.类的方法定义 3.类实现继承 二.es6转es5源码解析 总结 前言 在前几节里面,介绍了在 ...

  4. [HTML CSS JS ES6 JS WebAPI JQuery]学习笔记目录

    文章目录 前言 HTML HTML 知识整理与补充 CSS CSS 知识整理与补充 JS ES6 JS Web API JQuery JS 知识整理与补充 前言 根据视频和PPT整理 视频及对应资料: ...

  5. JavaScript前端经典面试题之ES6面试题汇总es6

    推荐阅读: vue3面试题:最新vue3.0前端经典面试试题及答案(持续更新中--)_南北极之间的博客-CSDN博客打包大小减少41%初次渲染快55%, 更新渲染快133%内存减少54%......使 ...

  6. es6 获取本月本年_微信小程序之ES6与事项助手

    本文发表至今已有一段时间,错别字多.文笔混乱.内容过于陈旧.本人建议读者不必细究,大概浏览即可,最新的开发指南还是以官方文档为准,该博文的示例代码经过了重构,已经与官方文档同步,可能与文中的代码片段有 ...

  7. 如何使用React.js和Heroku快速实现从想法到URL的转变

    by Tom Schweers 由汤姆·史威士(Tom Schweers) 如何使用React.js和Heroku快速实现从想法到URL的转变 (How to go from idea to URL ...

  8. 你不知道的JavaScript系列(一)—— 类型

    为什么80%的码农都做不了架构师?>>> JavaScript中有七种内置类型: 1.空值(null) 2.undefined 3.布尔值(boolean) 4.数字(number) ...

  9. vue使用python_如何使用Python和Vue创建两人游戏

    vue使用python by Neo Ighodaro 由新Ighodaro 如何使用Python和Vue创建两人游戏 (How to create a two-player game with Py ...

  10. 回顾2017年JavaScript状况

    by Sacha Greif 由Sacha Greif 回顾2017年JavaScript状况 (A Look Back at the State of JavaScript in 2017) 在20 ...

最新文章

  1. IDEA 报错红色下划线“cannot resolve”但仍能运行的解决方法
  2. 怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!
  3. 安装AverMedia UltraA 实时游戏录屏转播模块
  4. 通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!...
  5. 关于WebApi 跨域问题的解决的方式
  6. Java黑皮书课后题第3章:**3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小、花色
  7. mysql5.7.17的linux安装,linux下mysql5.7.17最新稳定版本安装教程
  8. java 8 lambda_异常作弊– Java 8 Lambdas
  9. 22 省遭受重大洪灾,机器学习未来能预报么?
  10. 滴滴CTO张博:过去的1095天 人工智能发展主要依赖3件事
  11. php获取当前域名的方法 如何获得域名
  12. C语言52单片机串口中断,52单片机的中断及其使用方法
  13. obj、fbx 转 3dtiles(免费转换工具)
  14. 微信小程序真机预览图片图标无法显示
  15. 手机植入木马可以监视你的一举一动,黑客是怎样入侵别人手机的?
  16. 在轮询系统如何将A站订单在B站自动建立,并调用B站产品
  17. Python markdown转epub (格式间转换)
  18. php 函数索引 中文索引
  19. c#实现循环输入商品编号和购买数量,结账时应付金额并找零
  20. 【LabVIEW懒人系列教程-小白入门】1.15LabVIEW程序结构之跑马灯

热门文章

  1. Java学习笔记(十)——开发个小项目(GoBang2.0)
  2. 关于国内LTE宽带集群通信知识现状介绍
  3. 计算机源代码可以用中文吗,为什么很多人说电脑程序不能使用中文呢?
  4. 训练集、验证集、测试集以及交验验证的理解
  5. 人工智能谓词逻辑——猴子摘香蕉问题
  6. docker端口映射失败解决方法
  7. 搜索引擎网站提交入口
  8. Boxy SVG for Mac(矢量图编辑器)
  9. 计算机科学与技术双一流排名,计算机科学与技术学科排行榜(大学名单大全2020版)...
  10. windows注册表操作——备份,还原注册表,清除注册表卸载残留信息