一、es6简介 ECMAScript 是一个标准 ECMAScript 5.1 es5 2011年发布 es6就是es5的下一个版本,2015.6发布es6的第一版 es2015 ,2016.6发布es6的第二个版本 es2016 ,2017年发布es6的第三个版本,es2017 es6 是涵盖了es2015,es2016,es2017等版本 es6 是严格版的es5 类似于html5 和Xhtml1.0 "use strict";
二、es6基础语法 1. let es6新增的声明变量的关键字 类似于var 但有所不同: 不同: 1) 作用域不同 var声明的变量可以在大括号外调用,let声明的变量只能在代码块内部有效 代码块:我们认为一个大括号可以封闭一个代码块 eg:
for(var i=0; i<10; i++){ console.log(i); } console.log(i);//10 for(let i=0; i<5; i++){ console.log(i); } console.log(i);//报错 i is not defined { let a=10; } console.log(a);//报错 a is not defined
2) 没有变量提升 3) 暂时性死区 使用let声明之前的变量都是不可用的 eg:
var a=123; if(1){ a='abc';//报错 a is not defined console.log(a);//abc let a; // 结束暂时死区 console.log(a);//undefined a=456; console.log(a);//456 }
4) 不允许重复声明 let不允许在相同作用域内部重复声明同一个变量,所以也是不允许在函数中重新声明参数
eg:
let b=10; let b=1; console.log(b);//Uncaught SyntaxError: Identifier 'b' has already been declared
2.块级作用域 1) es5 只有全局作用域和函数作用域,没有块级作用域 eg:
var a='hello'; function f() { //在这个函数中因为有var声明了a,所以其中所有的a都是这个局部作用域的a,与全局作用域的a='hello'没有关系 console.log(a);//undefined if(a){ var a='你好'; } console.log(a);//undefined } f();
2) let 为 js增加了块级作用域 eg:
var a='hello'; function f() { console.log(a);//hello if(a){ let a='你好'; console.log(a);//你好 } console.log(a);//hello } f();
3) es6 允许块级作用域嵌套 4) 外层作用域无法读取内层作用域的变量 5) 内层作用域可以定义与外层作用域的同名变量 eg:
{ let a=1; { let a=2; { let a=3; console.log(a);//3 } console.log(a);//2 } console.log(a);//1
6) IIFE被抛弃 7) 块级作用域与函数声明 es5 只允许在顶层作用域或函数作用域中声明函数,不能在块级作用域中声明函数 8) do 表达式(暂时不能用) 块级作用域是一个语句,将多个操作封装在一起,没有返回值 在块级作用域以外,没有办法得到内部的值,除非是全局变量 一个提案,使块级作用域可以变为表达式,也就是说可以返回值,就是使用do表达式
3. const常量 1) const 声明一个常量,一旦声明,就不能被改变 2) 常量一旦声明,必须立即初始化,不能留到以后赋值 3) const本质 const其实并不是值不让改变,而是变量指向的内存地址不得改动,对于基本数据类型,值就保存在变量指向的内存地址,所以不能被改变,但是对于对象类型,变量存储的是指针,const能保证这个指针不变,但是数据结构是可以改变的 如果const定义一个数组,数组本身是可写的,但是要想将一个新的数组赋值给这个arr,就会报错 const arr=[]; arr.push('hello');//["hello"] console.log(arr); arr=['hello'];//报错 Uncaught TypeError: Assignment to constant variable. 4.顶层对象 es5中顶层对象是window,顶层对象的属性与全局变量是等价的 es6规定,var 和 function 命令是全局变量,依旧是顶层对象的属性,但是let和const,class命令的全局变量不属于顶层对象的属性,也就是说es6开始,全局变量逐渐与顶层对象的属性脱钩