ES6是JavaScript語言的下一代標準,已經在2015年6月正式發佈了,由於ES6的第一個版本是在2015年發佈的,因此又稱ECMAScript 2015(簡稱ES2015)。本文主要講述的是ES6相對於ES5的幾個實用新特性,若有其它看法,歡迎指正和交流。react
在線babel轉換地址:http://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&code=數組
1. let關鍵字promise
(1)基本用法:let關鍵字用來聲明變量,它的用法相似於var,都是用來聲明變量。babel
(2)塊級做用域:let聲明的變量,只在let關鍵字所在的代碼塊內有效。異步
{ var a = 10; let b = 10; } console.log(a); //10 console.log(b); //error: b is not defined var c = 10; { var c = 20; } console.log(c); //20 var d = 10; { let d = 20; } console.log(d); //10 var i=0; for(var i=0; i<10; i++) { } console.log(i); //10 var j=0; for(let j=0; j<10; j++) { } console.log(j); //0
(3)不存在變量提高:let聲明的變量必定要在聲明後使用,不然會報錯函數
console.log(a); //undefined console.log(b); //error: b is not defined var a = 10; let b = 10;
2. const關鍵字this
(1)基本用法:聲明一個只讀的常量。一旦聲明,常量的值就不能改變。lua
console.log(a); //undefined console.log(b); //error: b is not defined var a = 10; let b = 10;
(2)其餘特性與var關鍵字一致spa
3. 字符串拼接方法prototype
(1)基本用法:用反引號進行拼接
/*ES5中字符串處理方法*/ var name = "Jack"; var str1 = 'my name is ' + name; console.log(str1); //my name is Jack /*ES6中字符串處理方法*/ var str2 = `my name is ${name}`; console.log(str2); //my name is Jack
4. function函數
(1)基本用法:默認參數
/*ES5中函數默認參數處理方法*/ function fn1(height) { var height = height || 100; console.log(height); } fn1(); //100 /*ES6中直接在形參賦值進行設置默認參數*/ function fn2(height = 100) { console.log(height); } fn2(); //100
(2)箭頭函數
/*ES5中定義一個函數變量*/ var fn1 = function(height) { console.log(height); } fn1(100); //100 /*ES6中用箭頭函數定義函數變量*/ var fn2 = (height) => { console.log(height); } fn2(100); //100
/*箭頭函數特性:箭頭函數的this指針保持和外層指針一致*/ var ele = document.getElementById('ele'); //獲取某個元素,綁定點擊事件 ele.onclick = function() { setTimeout(function() { console.log(this); //點擊後,打印出window對象 }, 10) } ele.onclick = function() { setTimeout(() ()=> { console.log(this); //點擊後,打印出ele元素對象 }, 10) }
/*箭頭函數特性:箭頭函數的argumets對象和外層一致*/ function fn1(height) { setTimeout(function() { console.log(arguments); }, 10) } function fn2(height) { setTimeout(() => { console.log(arguments); }, 10) } fn1(100); //[] fn2(100); //[100]
5. 變量的結構賦值
(1)基本用法
/*ES5初始化變量*/ var a = 10; var b = 20; /*ES6解構賦初值*/ var [a, b] = [10, 20];
/*ES5獲取對象的key值*/ var obj1 = { username1: 'jack', password1: 123 } var username1 = obj1.username1; var password1 = obj1.password1; console.log(username1, password1); /*ES6經過解構拆包獲取對象的key值*/ var obj2 = { username2: 'jack', password2: 123 } var {username2, password2} = obj2; console.log(username2, password2);
/*字符串的解構賦值*/ var [a, b, c, d, e] = 'hello'; console.log(a, b, c, d, e); //h e l l o
/*數組的解構賦值*/ var [a, b, c] = ['hello', 'world']; console.log(a, b, c); //hello world
6. …拓展操做符
(1)基本用法
//合併數組 var arry = ['a', 'b']; var arry1 = arry.concat(['c']); //ES5數組拼接 var arry2 = [...arry, 'c']; //ES6...操做符拼接數組 console.log(arry1); //['a', 'b', 'c'] console.log(arry2); //['a', 'b', 'c'] //合併對象 var obj = {a: 1, b: 2}; var obj1 = {...obj, c: 3}; var obj2 = {...obj, a: 3}; console.log(obj1) ; // {a: 1, b: 2, c: 3} console.log(obj2) ; // {a: 99, b: 2}
/*拆分字符串*/ console.log([...'hello']); // [ "h", "e", "l", "l", "o" ]
/*合併成數組*/ function mergeArr(...Arrys) { console.log(arguments); } mergeArr('a', 'b', 'c'); //['a', 'b', 'c']; /*拆分數組*/ console.log(...['a', 'b', 'c']); //a b c
function fn1() { var arry = Array.prototype.sort.call(arguments, function(a, b) { return a - b; }) console.log(arry); } fn1(3,1,5,3,8,6); //1 3 3 5 6 8 /*...操做符將類數組轉換爲數組*/ function fn2() { var arry = [...arguments].sort(function(a, b) { return a - b; }) console.log(arry); } fn2(3,1,5,3,8,6); //1 3 3 5 6 8
7. 對象的一些實用方法
(1)Object.is():判斷兩個值是否相等,ES5比較兩個值是否相等,只有兩個運算符:相等運算符(==)和嚴格相等運算符(===)。它們都有缺點,前者會自動轉換數據類型,後者的NaN不等於自身,以及+0等於-0。
console.log(+0 === -0) //true,錯誤結果 console.log(NaN === NaN) //false,錯誤結果 console.log(Object.is(+0, -0)) // false,正確結果 console.log(Object.is(NaN, NaN)) // true,正確結果
/*普通值的比較*/ console.log(Object.is('foo', 'foo')) //true console.log(Object.is({}, {})) //false
(1)Object.assign():合併對象的方法,將源對象(source)的全部可枚舉屬性,複製到目標對象(target)。
/*使用方法*/ var target = {a: 1, b: 1 }; var source = {c: 1}; console.log(Object.assign(target, source)); //{a: 1, b: 1, c: 1}
/*若是目標對象與源對象有同名屬性,或多個源對象有同名屬性,則後面的屬性會覆蓋前面的屬性*/ var target = {a: 1, b: 1 }; var source = {a: 20, c: 1}; console.log(Object.assign(target, source)); //{a: 20, b: 1, c: 1}
/*運用:克隆對象*/ function clone(origin) { return Object.assign({}, origin); } var obj1 = { a: 2 } var obj2 = clone(obj1); console.log(obj2); //{a: 2} /*注意:Object.assign方法實行的是淺拷貝,而不是深拷貝。也就是說,若是源對象某個屬性的值是對象,那麼目標對象拷貝獲得的是這個對象的引用。*/ var obj1 = {a: {b: 1}, c: 1}; var obj2 = Object.assign({}, obj1); obj2.a.b = 100; obj2.c = 200; console.log(obj1); //{a: {b: 100}, c: 1}
/*運用:合併對象*/ var merge = (...sources) => Object.assign({}, ...sources); console.log(merge({a: 1}, {b: 2}, {a: 3, c :3})); //{a: 3, b: 2, c: 3}
8. promise對象
(1)定義:一種異步函數的解決方案,避免了異步函數層層嵌套,將原來異步函數轉換 爲便於理解和閱讀的鏈式步驟關係
(2)三種狀態:Pending(進行中)、Resoloved(已完成)、Rejected(已失敗)。
(3)兩種結果:Pending->Resoloved(成功); Pending->Rejected(失敗)。
(4)then方法:第一個參數是成功時調用的函數,第二個參數是失敗時調用的函數。
(5)一般形式。
var promise = new Promise((reslove, reject) => { if(條件成立) { /*Pending->Resoloved(成功*/ reslove(); }else { /*Pending->Rejected(失敗)*/ reject(); } })
/*運用:隔1s打印‘hello’,隔2s打印‘world’*/ /*ES5實現方法*/ setTimeout(function(){ console.log('hello') setTimeout(function(){ console.log('world') }, 1000) }, 1000) /*Promise實現方法*/ var wait1000 = (str) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(str); }, 1000) }) } wait1000('hello').then((data) => { console.log(data); return wait1000('world'); }, () => { console.log('err'); }).then((data) => { console.log(data); })