如下內容大部分參考自阮一峯的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 模塊是動態引用,而且不會緩存值,模塊裏面的變量綁定其所在的模塊。
微信公衆號:撩碼