笔记参考以下链接:
阮一峰es6 http://es6.ruanyifeng.com/
1, ECMAScript2015,ES6,JavaScript,java区别与联系
(1)ECMA标准化组织,ECMAScript是标准,JavaScript是实现
(2)ECMAScript2015(ES2015)在2015年6月发布的ES6的第一个版本,ES6泛指JS5.1版本之后的下一代标准
(2)JavaScript与java基本上没有啥关系,如果要说有的话,那也是JavaScript在起名字的时候蹭了Java的热度而已。
2,let,const 与 var
(1)声明与赋值
let 声明变量(对同一变量不能重复赋值),
const 声明常量(声明与赋值在一起,而且赋值后,值不能发生变化),
var 声明变量(神一般的存在,可重复赋值,可变量提升)
console.log(a); //Uncaught ReferenceError: a is not defined; let无变量提升
let a=1; let a=2; //Uncaught SyntaxError: Identifier 'a' has already been declared
const b; //Uncaught SyntaxError: Missing initializer in const declaration
console.log(c); //undefined; c变量声明提升
var c=1; //var可以重复赋值(很容易引起错误)
var c=2;
(2)暂时性死区
在 let 和 const 存在的区块内,会绑定该区块,形成封闭作用域。
在变量未声明之前,是该变量的暂时性死区,引用该变量会抛出错误
(3)作用域(全局作用域,函数作用域,块级作用域)
ES5 仅存在全局作用域和函数作用域, ES6 新增了块级作用域
i,为啥要使用块级作用域(不使用会出现什么问题)
问题一:内层变量可能覆盖外层变量
问题二:计数循环的变量泄露为全局变量
ii,块级作用域内可以声明函数
方法:
if(true){ let a=1; let b = function() { // 块级作用域内声明函数,要写成函数表达式的形式,避免使用函数声明形式 alert(b); }; }
(4)顶层对象
浏览器环境:window
node环境: global
es5 : 同全局变量
es6: var 和 function 声明的全局变量是顶层对象; let 和 const 和class 和 import声明的全局变量不是顶层对象
3,解构赋值
(1)特点
i,左右两边结构必须一致(模式匹配)
ii,右边必须是个东西(必须是可遍历的解构)
iii,声明和赋值不能分开(必须在一句话内完成)
let [a, b, c] = [1, 2, 3]; //数组解构赋值,其中a=1, b=2, c=3 let {aa, bb} = {aa:1, bb:2}; //json解构赋值,其中aa=1, bb=2;
let {foo:bar} = {box:1}; // 解构失败,则bar=undefined
//使用默认值,当右边的某一成员 === undefined 时,才会使用默认值
let [x=1, y=2,z=x] = [11,null]; //x=11, y=null, z=2. 因为null== undefined,但是不是严格相等,所以y=null; 右边的z没有赋值,=== undefined,所以使用默认值,为x的值
let [x=f()] = [1]; //x=1,当默认值为表达式,因为右边已经对 x 赋值了,所以f()不会调用当做默认值。
(2)解构赋值的使用
i,数组的解构赋值
let [a, b, c] = [1,2,3]; //a=1, b=2, c=3, 数组按位置分别进行解构赋值
ii,对象的解构赋值
let {a:b, c:d} = {a:1, c:2}; //b=1, d=2,
iii,数值和布尔值的解构赋值
iv,函数参数的解构赋值
(3)解构赋值的用途