以下是我整理的一些,方便自己查看学习,未完持续
ES6是什么?
ECMAScript6(以下简称ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。
ES6的目标,是使得JavaScript语言可以用来编写大型的复杂的应用程序,成为企业级开发语言。
ES6和JavaScript的关系:
前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 JScript 和 ActionScript)。日常场合,这两个词是可以互换的。
ES6怎么用?
1.变量
var:一般函数中都是用var去定义变量,因为它是关键字可以预解析。
let:ES6中推荐使用let去定义变量,let定义的是一般变量。
const:const声明一个只读变量,声明之后不允许改变。
示例:
1.1 let 是在代码块内有效,var 是在全局范围内有效:
1 { 2 let a = 0; 3 var b = 1; 4 } 5 a // ReferenceError: a is not defined 6 b // 1
1.2不能重复声明,let 只能声明一次 var 可以声明多次:
1 let a = 1; 2 let a = 2; 3 var b = 3; 4 var b = 4; 5 a // Identifier 'a' has already been declared 6 b // 4
1.3 for 循环计数器很适合用 let:
1 for (var i = 0; i < 10; i++) { 2 setTimeout(function(){ 3 console.log(i); 4 }) 5 } 6 // 输出十个 10 7 for (let j = 0; j < 10; j++) { 8 setTimeout(function(){ 9 console.log(j); 10 }) 11 } 12 // 输出 0123456789
变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。
变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。(若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。
1.4暂时性死区
1 var PI = "a"; 2 if(true){ 3 console.log(PI); // ReferenceError: PI is not defined 4 const PI = "3.1415926"; 5 }
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。
2.箭头函数
ES6允许使用“箭头”(=>)定义函数
示例:
2.1 替换匿名函数
1 基本用法//匿名函数 2 div.onclick=function(){ 3 console.log("你好") 4 } 5 //箭头函数 6 div.onclick=()=>{ 7 console.log("你好") 8 }
2.2 有一个参数的箭头函数
1 var fn=(a)=>{ 2 console.log("abc"); 3 } 4 //一个参数可以省略小括号,等价于: 5 var fn=a=>{ 6 console.log("abc"); 7 }
2.3 有2个及更多参数的箭头函数
1 var f=(a,b,c)=>{ 2 console.log("abc") 3 }
1 var p={ 2 age:18, 3 //es6中对象方法的箭头函数表示形式 4 run:()=>{ 5 setTimeout(()=>{ 6 //this:window 7 console.log(this);//this是window 8 },100) 9 }, 10 travel:function(){ 11 //this:p 12 setTimeout(()=>{ 13 console.log(this);//this是p 14 },100) 15 }, 16 //推荐使用的方式☆☆☆:es6中对象方法的简写形式 17 say(){ 18 console.log("say方法中的this:",this); 19 setTimeout(()=>{ 20 console.log("say内部的延迟函数:",this);//this是p 21 },100) 22 }, 23 } 24 25 p.run(); 26 27 p.travel(); 28 29 p.say();
2.4 箭头函数和普通匿名函数有哪些不同?
- 函数体内的this对象,就说定义所在的对象,而不是使用所在的对象
- 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误
- 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
- 不可以使用yield命令,因此箭头函数不能用作Generator函数
- generator函数现在经常用async替代
3.class类
在ES6中,class作为对象的模板被引入,可以通过class关键字定义类,本质是function。
示例:
3.1 类定义:
1 // 匿名类 2 let Example = class { 3 constructor(a) { 4 this.a = a; 5 } 6 } 7 // 命名类 8 let Example = class Example { 9 constructor(a) { 10 this.a = a; 11 } 12 }
注意:不可以重复声明一个类
class Example{} class Example{} // Uncaught SyntaxError: Identifier 'Example' has already been // declared let Example1 = class{} class Example{} // Uncaught SyntaxError: Identifier 'Example' has already been // declared
3.2 继承 子类 constructor 方法中必须有 super ,且必须出现在 this 之前。
class Poetry { constructor(){ console.log('山有木兮木有之'); } } class Person extends Poetry{ constructor(){ super(); console.log('本是青灯不归客'); } } let ht = new Person();
4.解构赋值
解构赋值是对赋值运算的扩展。它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在解构中,有两部分:
- 解构的源,解构赋值表达式的右边部分。
- 解构的目标,解构赋值表达式的左边部分。
4.1 数组模型的解构
//1.基本 let [a, b, c] = [1, 2, 3]; // a = 1 // b = 2 // c = 3 //2.可嵌套 let [a, [[b], c]] = [1, [[2], 3]]; // a = 1 // b = 2 // c = 3 //3.可忽略 let [a, , b] = [1, 2, 3]; // a = 1 // b = 3 //4.不完全解构 let [a = 1, b] = []; // a = 1, b = undefined //5.剩余运算符 let [a, ...b] = [1, 2, 3]; //a = 1 //b = [2, 3] //6.字符串等 //在数组的解构中,解构的目标若为可遍历对象,皆可进行解构赋值。可遍历对象即实现 //Iterator 接口的数据。 let [a, b, c, d, e] = 'hello'; // a = 'h' // b = 'e' // c = 'l' // d = 'l' // e = 'o' //7.解构默认值 let [a = 2] = [undefined]; // a = 2 //当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。 let [a = 3, b = a] = []; // a = 3, b = 3 let [a = 3, b = a] = [1]; // a = 1, b = 1 let [a = 3, b = a] = [1, 2]; // a = 1, b = 2
4.2对象模型的解构
//1.基本 let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; // foo = 'aaa' // bar = 'bbb' let { baz : foo } = { baz : 'ddd' }; // foo = 'ddd' //2.可嵌套可忽略 let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { y }] } = obj; // x = 'hello' // y = 'world' let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { }] } = obj; // x = 'hello' //3.不完全解构 let obj = {p: [{y: 'world'}] }; let {p: [{ y }, x ] } = obj; // x = undefined // y = 'world' //4.剩余运算符 let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}; // a = 10 // b = 20 // rest = {c: 30, d: 40} //5.解构默认值 let {a = 10, b = 5} = {a: 3}; // a = 3; b = 5; let {a: aa = 10, b: bb = 5} = {a: 3}; // aa = 3; bb = 5;
5.模板字符串
模板字符串相当于加强版的字符串,用反引号`,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。
5.1普通字符串
1 let string = `Hello' 'world`; 2 console.log(string); 3 // "Hello' 4 // 'world"
5.2多行字符串
1 let string1 = `Hey, 2 can you stop angry now?`; 3 console.log(string1); 4 // Hey, 5 // can you stop angry now?
5.3字符串插入变量和表达式
变量名写在${}中,${}中可以放入JavaScript表达式。
1 let name = "Mike"; 2 let age = 27; 3 let info = `My Name is ${name},I am ${age+1} years old next year.` 4 console.log(info); 5 // My Name is Mike,I am 28 years old next year.
5.4字符串中调用函数
1 function f(){ 2 return "have fun!"; 3 } 4 let string2= `Game start,${f()}`; 5 console.log(string2); // Game start,have fun!
注意:模板字符串中的换行和空格都是会被保留的