ECMAScript 6
ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言
ES6 是 ECMAScript 标准十余年来变动最大的一个版本,为其添加了许多新的语法特性。
发展历史
- 1997 年 ECMAScript 1.0 诞生。
- 1998 年 6 月 ECMAScript 2.0 诞生,包含一些小的更改,用于同步独立的 ISO 国际标准。
- 1999 年 12 月 ECMAScript 3.0诞生,它是一个巨大的成功,在业界得到了广泛的支持,它奠定了 JS 的基本语法,被其后版本完全继承。直到今天,我们一开始学习 JS ,其实就是在学 3.0 版的语法。
- 2000 年的 ECMAScript 4.0 是当下 ES6 的前身,但由于这个版本太过激烈,对 ES 3 做了彻底升级,所以暂时被"和谐"了。
- 2009 年 12 月,ECMAScript 5.0 版正式发布。ECMA 专家组预计 ECMAScript 的第五个版本会在 2013 年中期到 2018 年作为主流的开发标准。2011年6月,ES 5.1 版发布,并且成为 ISO 国际标准。
- 2013 年,ES6 草案冻结,不再添加新的功能,新的功能将被放到 ES7 中;2015年6月, ES6 正式通过,成为国际标准
- 用 let 声明的变量具有块级作用域,只能在声明的块中访问,在块外面无法访问
- 用let声明的变量也没有声明提前这一特性。
- 在同一个块中,let声明的变量也不能重复声明。
ES6 新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效
var lis = document.getElementsByTagName("li"); for(let i = 0; i < lis.length;i ++){ lis[i].onclick = function(){ console.log(i) } } console.log(i);
若用var来声明,则每次点击结果都相同
注意:
- 用 let 声明的变量具有块级作用域,只能在声明的块中访问,在块外面无法访问
- 用let声明的变量也没有声明提前这一特性。
- 在同一个块中,let声明的变量也不能重复声明。
const
声明一个只读的常量。一旦声明,常量的值就不能改变,const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。
const obj = {}; obj.name = "jack"; console.log(obj.name);
const fs = require("fs");
const http = require("http");
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
所谓Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
var pro = new Promise(function(resolve,reject){ resolve(123); //这个是成功的,我要把成功后的数据123传递出去 }) pro.then(function(val){ //then方法执行完成以后又返回了一个promise对象 //这个是成功的回调 console.log("成功了,接收到的数据为:" + val); return val + 1; },function(err){ //这个是失败的回调 console.log(err); }).then(function(val){ console.log(val) },function(err){})
Promise
对象有以下两个特点。
(1)对象的状态不受外界影响。Promise
对象代表一个异步操作,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise
这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise
对象的状态改变,只有两种可能:从pending
变为fulfilled
和从pending
变为rejected
。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise
对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
// 例一 const set = new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4] // 例二 const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); items.size // 5
可用此方法去除数组重复成员和去除字符串里面的重复字符。
Array.from
方法可以将 Set 结构转为数组。
const items = new Set([1, 2, 3, 4, 5]); const array = Array.from(items);
function arr(array) { return Array.from(new Set(array)); } arr([1, 1, 2, 3]) // [1, 2, 3]
解构赋值
// json格式 var {a,b,c} = {a:10,c:30,b:20}; //可以调换顺序 console.log(a,b,c); var [a,[b,c],d] = [5,[10,20],30]; //格式对应即可 console.log(a,b,c,d) // 解构 var [{a,b},c,[d,e],f] = [{b : "jack",a : "100"},5,[10,20],30]; console.log(a,b,c,d,e,f)
循环
var arr = ["red","green","blue","yellow","black"]; for(var i of arr){ console.log(i); //输出的直接是值 }
Map对象
// map就是用来存东西的,跟obj类似 var map = new Map(); // console.log(map); map.abc = "jack"; map.age = "100"; console.log(map); // 设置值 增 该 map.set("a","red"); map.set("b","green"); console.log(map) // //查 console.log(map.abc); console.log(map.get('a')); // // 删除 delete map.abc; delete map.a; map.delete("a"); console.log(map) var arr = []; arr.abc = "jack"; arr.age = "100"; console.log(arr) console.log(arr[0]);
箭头函数
var fun = () => { console.log(arguments); } fun(1,2,3,4)
在箭头函数中则没有这样的问题,在箭头函数中,this和定义时的作用域相关,不用考虑调用方式
箭头函数没有 this 绑定,意味着 this 只能通过查找作用域链来确定。如果箭头函数被另一个不包含箭头函数的函数囊括,那么 this 的值和该函数中的 this 相等,否则 this 的值为 window。