ECMAScript 6
AI-摘要
Tianli GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
简介
ECMAScript 6.0,简称ES6,是JavaScript语言的下一代标准,已经在2015年6月正式发布。其目标为使JavaScript可以用来编写复杂的大型应用程序,成为企业级开发语言。
参考资料
ECMAScript 6语法和应用
- ECMAScript 2015 花费6年时间敲定,是一个很大的发行版
- 认识ES6
- 函数的参数
- ES6兼容性解决
- 解构赋值
- let和 const
- Classl的用法
- 箭头函数
- JSON的新应用
- 数组的新增方法
- Module模块
- Map数据结构
- ES7-ES11的一些新特性介绍
- 字符串和新增方法和模版字符串
ECMAScript和 JavaScrip的关系
ECMA是“European Computer Manufacturers Association”的缩写,中文称欧洲计算机制造联合会。这个组织的目标是评估,开发和认可电信和计算机标准。
ECMA是标准, JavaScript是实现
- 类似HTML5是标准,IE10、 Chrome、FF都是实现
- 目的是让所有前端脚本都实现ECMA
- 目前只有 JavaScript实现ECMA标准, ECMAScript≈Js
ECMAScript简称ECMA或ES(ES6)
目前版本
- 高级浏览器支持ES6
- 低级浏览器主要支持ES3.1
版本记录
时间 | 版本 | 说明 |
---|---|---|
1996 年 11月 | JavaScript 的创造者 Netscape 公司将 JavaScript 提交给标准化组织 ECMA。 | |
1997年 | ES1 | ECMA 发布 262 号标准文件(ECMA-262),规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript (ES). |
1998年 | ES2 | 内容编辑加工,没有特性修改。 |
1999年 | ES3 | 有较完善的修改,成为JavaScript的通行标准,得到了广泛支持。 |
2000年 | ES4 | 2008年终止也称作JavaScript 2,因改动太大没有通过,Harmony项目启动来跟进,ES4大部分内容被 ES6 继承. Harmony部分内容放到ES6之后。 |
2009年 | ES5(ES3.1) | 新功能主要包括:JSON对象(包含parse/stringify等方法)、Array和Object增加一些方法,严格模式(use strict),函数的bind方法。 |
2011年 | ES5.1 | 成为 ISO 国际标准(ISO/IEC 16262:2011), 到了2012年底,主流浏览器都支持ECMAScript 5.1的全部功能 |
2015年 | ES2015(ES6) | 做了大量的更新,但向后兼容。ES6是一次重大改进。 部分功能:let/const、变量的解构赋值、Promise、箭头函数… |
2016年 | ES2016(ES7) | 新功能主要包括: 1. Array.prototype.includes检查数组中是否存在值;(区别ES6字符串的includes方法) 2. Exponentiation Operator 求幂运算 (a ** b等价于Math.pow(a,b)) |
2017年 | ES2017(ES8) | 部分功能: 1.Object.values/entries/getOwnPropertyDescriptors 2.String.prototype.padStart/padEnd 3.函数参数列表和调用中的尾逗号(Trailing commas) 4.Async Functions 异步函数(async/await) |
2018年 | ES2018(ES9) | 现在已经可用了。新增异步迭代、Promise.finally()、Rest/Spread 属性、正则表达式命名捕获组、正则表达式反向断言、非转义序列的模板字符串…… |
let&const
简介
- 为什么ES6新增 let 关键字声明变量:因为最起初 JavaScript 设计是写一写小的项目,当时没有考虑的很全面,后面使用的人多了,var 声明变量就暴露了它的缺陷
缺陷
var可以重复声明
1 |
|
var无法限制修改
- var无法限制修改
- var没有块级作用域{} if(){块内} for(){块内}
1 |
|
变量提升
- let 不支持变量提升
- var 不管放在哪里定义 都会把 var 语句提升到最前面
1 |
|
1 |
|
解决方法(闭包&let)
- ES6 以前的解决方法是通过
闭包
的方式解决 var 在块级中没有作用域但是在方法中有作用域
示例一
- 需求:块内输出块内自己的变量值,块外输出块外的变量值
1 |
|
示例二
- 需求:有 5 个按钮,每次点击打印对应的按钮序号
1 |
|
1 |
|
示例三(let)
1 |
|
const
- 限制修改(常量方式)
总结
- 以后都不用 var
- 如果变量需要修改就用 let
- 如果变量不希望修改就用 const 定义为常量
- 箭头函数定义的方法用 const 对象用 const 普通变量和数组用 let(我的个人习惯)
let
- ES6 新增 let 和 const 命令,用来声明变量,用法类似于 var
- let 声明的变量,只在 let 命令所在的代码块內有效
- let 命令不存在变量提升
- let 命令不允许在相同作用域内,重复声明同一个变量
const
- let 拥有的特性 const 也拥有
- const 不可以像 let 一样分步声明,例如: let a; a=10; 因为 const 的值不可改变,一旦定义了就不能修改,所以后面也不能进行赋值了
- const 命令声明一个只读的常量。一旦声明,常量的值就不能改变
- const 命令声明的常量不得改变值。即一旦声明就必须立即初始化。
- const 命令声明的常量,只在声明所在的块级作用域内有效
- const 命令声明的常量不提升,只能在声明的位置后使用
- const 命令声明的常量,与let一样不可重复声明
- const 命令声明的
复合类型的数据
(主要是对象和数组),变量指向的内存地址 const定义的基本类型不可修改,复合类型(对象,数组)也不可以修改
,复合类型的属性是可以修改
的 直接修改基本类型或者复合类型相当于修改栈内存中的地址是不允许的,修改复合类型对象的属性其实是修改该类型指向堆内存中的属性不受影响
1 | //const定义的常量不可修改,对象也不可以修改,对象的属性是可以修改的 |
对比
- const:不可修改(可以理解常量 java 中的 final)
- let:可以修改,(可以理解为变量)
箭头函数
简介
- ES6 允许使用“箭头”(=>)定义
- 不需要参数或需要多个参数,就用圆括号代
- 代码块部分多于一条语句,就用大括号括起来,并且用return返回
- 箭头函数返回对象时,必须在对象外面加上括号
- 箭头函数使得表达更加简洁
- 箭头函数能够简化回调函数
- 箭头函数类似于 jdk8 中的 lamda 表达式
示例一(箭头函数基本使用)
- 基本规则:1.把 function 换成 => 2.把 => 放在参数和 {} 的中间
- 如果只有一个参数 =
等号和箭头中间写形参名
=> - 如果 { } 大括号代码块内只有一条语句不用写
return 和大括号{ }
这里是同时都不写 - return 和大括号{ }一般是成对出现的,有大括号一般都有 return,如果有大括号里面哪怕只有一条语句也要加上 return 不然调用该方法的时候会出现 undefined
- 如果有多个参数或者没有参数也必须要用 () 来定义参数列表,没有参数的时候括号内就空着
1 |
|
示例二(数组排序)
- 方法的演变还是和上面示例一相同,1.把 function 换成 => 2.把 => 放在参数和 {} 的中间
- 箭头函数的函数体只有一条语句 不用加 { } 和 return
1 |
|
示例三(箭头函数返回对象)
- 返回的对象 obj 需要用法大括号包裹起来和箭头函数的大括号有冲突,所以可通过外面包裹一层
大括号+return
或者用小括号
包括返回的对象 - 不能直接像上面那样只有一条语句连对象的大括号都不写,对象需要用大括号包裹的不然 IDE 工具就会报错
1 |
|
示例四(构造方法)
- 箭头函数没有构造方法,因此不能用箭头函数定义一个方法然后还去 new 这个方法
1 |
|
关于箭头函数中的this的指向
简介
- 普通函数的this:指向它的调用者,如果没有调用者则默认指向window.
- 箭头函数的this: 指向箭头函数定义时所处的对象,而不是箭头函数使用时所在的对象,默认使用父级的this.
- 综上:箭头函数没有自己的this,它的this是继承而来,默认指向在定义它时所处的对象(宿主对象)。
- 上面三条看起很懵,没关系接着看下面的两个示例看完再回来理解这三条的含义
示例一
- 普通函数,谁调用这个方法,this 就代表谁,没有人调用直接运行就代表最大的 window 对象
- 箭头函数跟调用者无关,指向的是函数定义时所处的对象,可以理解为父级的 this 对象,如果父级没有,就再往上找,最后是到 window 对象
- 下图中 arrowThis2.html 的 fun1 定义在 adaThis2对象,该对象直接是在 window 里面定义的,因此上下文的 tihs 就是 window 所以无论怎么调用都会指向 window 对象
1 |
|
1 |
|
示例二
- 再次强调
普通函数的 this 指向和调用者有关
- 下面的内容主要是针对示例一更加直观的解释 this 指向问题(普通函数)
- 左侧代码大致的意思是定义了一个 box,设置了css 属性,当发生点击时添加新的样式进来,右侧是把添加新样式的方法写在了 setTimeout 里面等待三秒,因为 setTimeout 是 window 的对象,所以调用者不是 box 因此无法改变颜色,通过对比来阐述普通函数 this 对象指向的是调用者
1 |
|
1 |
|
示例三
- 本内容是对示例二中添加了 setTimeout 函数无法改变颜色获取我们期望的对象做修复
- 普通函数就在 setTimeout 前获取 this 对象,命名为 obj,此时的 obj 指向的是 box 对象,再用这个 obj 调用就相当于用 box 调用
普通函数 this 指向和调用者有关
箭头函数与调用者无关,指向箭头函数定义时所处的对象
1 |
|
1 |
|
数组新方法
常用新增方法
- filter 过滤器(过滤掉不符合条件的数据)
- map 映射(把数据映射到新的对象中)
- reduce 汇总(统计求和)
- some() 数组中有一个为真就返回真—>待补充(判断时候用)
- every() 数组中有全部为真才返回真—>待补充(判断时候用)
- 需求:有一批商品,现在要做促销活动,把价格大于等于 10 的商品打 5 折后计算此次促销会少赚多少钱 通过该需求进行 ES6 高级函数的演示
示例一
- 示例一中将用以前
原始的写法
进行实现需求 let n of array 语法可以了解一下
1 | //需求:有一批商品,现在要把大于或等于 10 元的商品促销打 5 折处理 |
示例二
- 示例二中采用 ES6 中新增的高级方法
filter
map
reduce
实现
1 | //需求:有一批商品,现在要把大于或等于 10 元的商品促销打 5 折处理 |
示例三
- 在示例二的基础上进行
链式编程方式
,更加优雅的实现
1 | //需求:有一批商品,现在要把大于或等于 10 元的商品促销打 5 折处理 |
数据结构集合
set
简介
- set 集合和 java 的 set 集合差不多
- 集合中只能存放值,没有键,相同的值只能存储一个
- 一个 set 集合中可以同时存放不同的数据类型,比如整型,字符串,数组等
示例
- 常用方法:
add
delete
has
size
forEach
clear
1 | const obj = new Set(); |
map
简介
- 也和 java 的差不多,通过键值对存储 key->value
- Map 数据结构类似于对象,是键值对的集合,传统的键只能用字符串,Map 的键不限于字符串,各种类型的值(包括对象)都可以当作键。
- 属性和操作方法
- size 属性,返回 Map 结构的成员总数
- set(key,value)方法,设置set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该
- get(key) 方法,读取key对应的键值,如果找不到key,返回undefined
- has(key) 方法,返回一个布尔值,表示某个键是否在当前 Map 对象之中。
- delete(key) 方法,删除某个键,返回true。如果删除失败,返回false。
- clear(key) 方法,清除所有成员,没有返回值。
- Map 遍历
- keys() 返回键名的遍历器
- values() 返回键值的遍历器
- entries()返回所有成员的遍历器
- forEach()遍历Map的所有成员
示例
- 常用方法:
set
get
forEach
has
size
1 | const mapObj = new Map(); |
字符串新功能
- startsWith 判断以什么字符串开头
- endsWith 判断以什么字符串结尾
- 模板字符串
判断开头与结尾
1 | let url = "www.adalucky.com" |
模板字符串
- 模板字符串 ``定义字符 ${} 引用变量
- 支持换行
1 | let title = "这是标题"; |
解构赋值
简介
- 解构赋值,序列解包,
- 注意事项:结构构必须一样,比如数组两边都需要用数组[a,b,c]=[1,2,3] 对象{UserName,UserAge,UserSex}={“name”: “ada”, “age”: “25”, “sex”: “男”}
- 接受的参数个数不能操作数据的长度,可以少,当少于长度时按照从左到右顺序解构
- 解构赋值不能像定义变量一样分开声明和赋值,例如 let [a,b]; [a,b]=[1,2]
基础的解构
1 | let arr = [1, 2, 3]; |
1 | let arr = [1, 2, 3,4]; |
复杂的解构
- 这种复杂的一般比较少不常用
- ①先确定外层结构两边保持一至 ②内层结构中有对象+数组的 那么用 对象名:[] 来二次结构 ③对象的数组中又有对象用,对象名:[{对象名}]
1 | //较为复杂的组合结构 ①先确定外层结构两边保持一至 ②内层结构中有对象+数组的 那么用 对象名:[] 来二次结构 ③对象的数组中又有对象用,对象名:[{对象名}] |
扩展运算符
简介
- …三点运算符
- 展开数组
- 默认参数
和java 中的可变参数一样
数组展开放入
- 先展开数组然后按照所在位置存入数组中
1 | let arr1 = [1, 2, 3]; |
参数传递
- 如果方法中有自定义的参数和需要可变参数,可变参数需要放在最后一个形参中
1 | let arr1 = [1, 5, 3,7,9]; |
class
简介
- ES6之前 JavaScript 叫做基于对象,ES6 新增了 Class(类)的概念,可以说是面向对象的
- constructor 是构造方法
- this关键字代表实例对象
- 通过extends关键字实现继承
- super关键字,表示父类的构造函数,用来新建父类的this对象
对比
- 通过截图中左右两段代码可看出来 ES6 的定义类、方法、构造方法层次更加清晰
1 | //ES6 前既是构造函数又是方法 |
1 | class Person { |
继承
- 继承通过关键字 extends 实现
- 子类如果重写了父类的方法调用的是子类自己的方法
- 子类的方法中如果需要调用父类的其它方法可以使用 super.run() super.say() 这种方式
1 | class Person { |
JSON
简介
- JSON.stringify() 串行化
- JSON.parse() 反串行化
- 简写
- (属性和值)名字一样可以简写
- 方法一样可以简写(:function省)
简写
1 | const user1 = {name: "ada", age: "20", sex: "男"} |
串行化、 反串行化
- 串行化:JSON 对象转成 字符串
- 反串行化:JSON 格式的字符串转成 JSON
1 | const user3 = { |
Module模块化
简介
- 模块化优点:减少命名冲突 避免引入时的层层依赖 可以提升执行效率
- export命令:用于规定模块的对外接口,一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。
- import命令:用于输入其他模块提供的功能,import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同。
冲突示例
- 当我们在 html 中引入的 js 时,多个 js 存在重复的变量名、方法名、函数名,就会发生冲突,已经命名的不能重复命名
- 解决方法:给每个 js 文件类型都设置成 module,这样都是独立的了
导入导出
坑
:如果是用 node 运行,导入导出使用的关键分别为require
module.exports
坑
:如果是用 浏览器 运行,导入导出使用的关键分别为import
export
注意事项
:如果是用 node 运行,文件后的 .js 可以不写,如果是浏览器运行导出的文件必须写后缀 .js
(这里不包含打包工具处理哈,可能有些打包工具会自动处理上述问题)- 导出的时候可以整体用一个 export {导出1,导出 2,…} 也可以在单个上用 export 导出
- 导入导出时需要使用到
解构赋值
JSON 简写
的方式比较简便
示例一
- 导入时有命名冲突的可在导入方用 as 起别名
1 | //导出 简写 x:x y:y json中支持的简写方式 既是Key又是value |
1 | export {add, mun,Person} |
1 | //如果是用 node 运行,导入关键字为 require,文件后的 .js 可以不写,如果是浏览器运行导出的关键字为 import,文件后的 .js 必须写 |
1 |
|
示例二
- 导出时一个 js 文件最多可以定义一个匿名的 default 导出,由导入方定义名称
- 导出的时候也可以通过 as 起别名
- 导入的时候可以用
* as name
把暴露的接口都整合在一个对象中,使用时直接用这个对象来操作
1 | export {x, y }; |
1 | export {name as myName, age, sex, Person} |
1 | import {x,y} from "./dome.js"; |
1 |
|
评论
匿名评论隐私政策