如下内容大部分参考自阮一峰的ES6在线教程javascript
let
和const
unicode
表示相同点html
let
和const
声明的变量,都是块级做用域,都只在其所在的代码块
内有效let
和const
声明的变量,都不存在变量提高let
和const
声明的变量,都存在临时性死区let
和const
都不容许在经过一个做用于内重复声明同一个变量let
和const
都不容许在函数内对参数从新声明let
和const
声明的变量,都不是顶层对象的属性不一样点java
let
声明的是变量,声明后,能够在任意时刻赋值,修改const
声明的是常量,声明后必须马上赋值,且之后不容许修改相同点react
let
和var
都是声明一个变量let
和var
声明的变量,都是能够在声明后,任意时刻赋值,修改不一样点git
let
无变量提高,var
有变量提高let
是块级做用域,var
是函数级做用域let
不可在做用域内重复声明同一个变量,var
能够在同一个做用域内声明同一个变量let
声明的变量不属于顶层对象的属性,var
声明的变量属于顶层对象的属性let
存在临时性死区,var
不存在临时性死区其余es6
let
和var
声明同名变量,无论谁先谁后都不行const
实际保证的,并非变量的值不能改动,而是变量指向的那个内存地址
所所保存的数据不能改变。github
JavaScript中的简单类型数据,好比string
, number
, boolean
, null
, undefined
,值就保存在变量指向的那个内存地址,而复合类型的数据,变量指向的那个内存地址,保存的是指向实际数据的一个指针。编程
ES6新概念:临时性死区——TDZ——Temporal Dead Zonejson
因为代码(代码块,函数,模块......)中的变量尚未被初始化而不能使用的状况,具体表现为——报错:Uncaught ReferenceError: xxx is not defined
,let
,const
,class
都有临时性死区的表现。在ES6以前,若是在变量初始化以前使用变量,并不会报错,只是其值为undefined
而已。数组
惰性求值
的length
属性:function add(a, b, c=3){} add.length === 2;// true
use strict
,报错:Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list
rest
参数只能是尾参数rest
参数不计入函数的length
属性rest
参数是一个真正的数组,arguments
是类数组name
属性会返回实际的函数名this
就是定义时的对象,而不是使用时的对象arguments
对象,使用...rest
参数代替Generator
函数apply
,bind
,call
改变this
指向可解构赋值的:
// a === 12 // b === 33 const [a, b] = [12, 33];
// f === 120 // h === 56 const [f, h = 100] = [120, 56];
// f === 120 // h === 100 const [f, h = 100] = [120, undefined];
// a === 'Pelli' // b === 89 const {a, b} = {a: 'Pelli', b: 89};
// a === 'pelli // b === 18 // c === 'worker' const { myname: a, age: b, job: c } = { myname: 'pelli', age: 18, job: 'worker' };
// p === 'ppp' // q === 'hello world' const {p, q = 'hello world'} = {p: 'ppp', q: 'qqqq'};
// a === 'h' // b === 'e' // c === 'l' const [a, b, c] = 'hello world';
const args = function(){return arguments;} const ags = args(3, 4, 5, 6, 12, 2, 3); // a === 3 // b === 4 // c === 5 // d === 6 // e === 12 // f = 2 const [a, b, c, d, e, f] = ags;
最佳实践:任什么时候候都不要在解构赋值中放置圆括号
如下状况不能使用
只有一种状况可使用圆括号
模式
部分Symbol
不是构造函数,定义一个Symbol
,前不用加new
,正确使用方式为: const s = Symbol()
Symbol
值做为对象属性名时,只能使用[]
方式访问,不能经过点运算符访问属性Symbol
是独一无二的值arguments
,string
,array
,set
,map
add
方法返回的是Set
对象,能够链式调用set
方法,返回的是Map
对象,能够链式调用NaN
Object.is(0, -0); // false
,可是,Set内部0
和-0
相等,只能存在一个.pending
时,没法得知目前的进展在哪个阶段,换一种说法是没法肯定事件的完成度setTimeout 0
先执行Promise
自己并非异步的,Promise
中的“异步”特性是由resolve
或者reject
的执行时机带来的
// 下面几行代码输出顺序为:3,2,1 setTimeout(() => { console.log('1'); }, 0); var p = new Promise((resolve, reject) => { resolve('2') }); p.then((val) => { console.log(val, 'promise'); }) console.log('3');
另外的几行代码:
// 下面几行代码输出顺序为:3,1,2 setTimeout(() => { console.log('1'); }, 0); var p = new Promise((resolve, reject) => { setTimeout(() => { resolve('2') }, 0); }); p.then((val) => { console.log(val, 'promise'); }) console.log('3');
参考来源:http://es6.ruanyifeng.com/#docs/promise
理由是下面这种写法能够捕获前面then方法执行中的错误(也就是说,catch不只能够捕获到promise被拒绝的状态,也能够捕获前面then方法中的错误),也更接近同步的写法(try/catch)。所以,建议老是使用catch方法,而不使用then方法的第二个参数。
p.then(function(val){}).catch(function(msg){})
的写法
var p = new Promise(function(resolve, reject){ setTimeout(function(){ var status = Math.random() * 10; if(status > 5){ resolve(status); }else{ reject('失败'); } }, 10000); }); p.then(function(value){ console.log(value); }).catch(function(msg){ console.log(msg); });
不推荐的写法以下:
then
方法传递两个参数,第二参数是当被拒绝的时候执行的函数
var p = new Promise(function(resolve, reject){ setTimeout(function(){ var status = Math.random() * 10; if(status > 5){ resolve(status); }else{ reject('失败'); } }, 10000); }); p.then(function(value){ console.log(value); }, function(msg){ // 这里只有在promise被拒绝的时候才会执行 // 若是then方法报错了,这里没法获知 console.log(msg); });
Promise
不能直接作函数调用,即不能:Promise()
class
能够看作是语法糖,只是让对象原型的写法更加清晰,更像面向对象的编程语言new
一块儿使用prototype
上面length
属性值是constructor
的参数个数(不包括有默认值的参数)NaN
Number
扩展,Number.isNaN()
ES6
中,window
的方法isNaN()
是为了保证向下兼容性,在ES6
中,建议使用Nunber.isNaN()
Object.is()
中,NaN
和NaN
是相等的,Object.is(NaN, NaN) === true
Set
中,只容许存在一个NaN
CommonJS
、AMD
、CMD
、UMD
,ES6 Module
CommonJS
和AMD
,CommonJS
用于服务器,AMD
用于浏览器编译时
就能肯定模块的依赖关系以及输入输出的变量CommonJS
和AMD
模块,都只能在运行时
肯定这些东西,好比,CommonJS
模块就是对象,输入时必须查找对象属性编译时
加载,使得静态分析成为可能"use strict;"
this
指向undefined
import
有提高效果,会提高到整个模块以前。提高效果的实质是:import
命令是编译阶段
执行的,编译阶段老是在代码实际运行以前import
是静态执行的,不能使用表达式和变量,由于表达式和变量只有在运行时才能获取到结果import
语句,则只会真正执行一次,不会执行屡次import 'react';
,import {lodash} from 'lodash';
, , import * from 'react'
, export var a = 12;
, const a = 55; export default a;
export default
其实是输出一个名为default
的变量,因此不能在export default
后面加变量声明语句import
语句是在编译时执行的,是静态的this
指向undefined
;CommonJS
模块的顶层this
指向当前模块,这是二者的一个重大差别。arguments
,require
,module
,exports
,__filename
,__dirname
ES6 模块的运行机制与 CommonJS 不同。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。换句话说,ES6 的import有点像 Unix 系统的“符号链接”,原始值变了,import加载的值也会跟着变。所以,ES6 模块是动态引用,而且不会缓存值,模块里面的变量绑定其所在的模块。
微信公众号:撩码