ES6的新特性
- ES6簡介:ES6是新一代的JS語言標準,對分JS語言核心內容做了升級優化,規範了JS使用標準,新增了JS原生方法,使得JS使用更加規範,更加優雅,更適合大型應用的開發。學習ES6是成為專業前端正規軍的必經之路。不學習ES6也可以寫程式碼打鬼子,但是最多隻能當個游擊隊長
1、 let 和 const
- var是傳統的函式的作用域 ,存在變數提升,即在變數宣告之前使用的就是undefined
- let是不存在變數提升的,但是有塊級作用域,暫時性死區
- const與let類似,但是他定義的變數是不可以修改的
- 在我們開發的時候,可能認為應該預設使用 let 而不是 var,這種情況下,對於需要防寫的變數要使用 const。 然而另一種做法日益普及:預設使用 const,只有當確實需要改變變數的值的時候才使用 let。這是因為大部分的變數的值在初始化後不應再改變,而預料之外的變數的修改是很多 bug 的源頭。
var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
複製程式碼
塊級作用域
- 內層作用域和外層作用域不會互相影響
{{{{
let insane = 'Hello World';
{let insane = 'Hello World'}
}}}};
複製程式碼
ES6對於操作字串和陣列上增加了一些方法
陣列方法
-
1、陣列的includes方法
-
[1, 2, 3].includes(4)// false
-
[1, 2, NaN].includes(NaN) // true
-
[1, 2, 3].includes(2)// true
-
-
2、陣列的解構賦值 let [a,b,c]=[1,2,3]
-
3、陣列的去重傳統方式vsES6的新方法
varary =[12,24,26,12,24,15,32,15,24];
varary1 =[];
for(vari=0;i<ary.length;i++){
if(ary1.indexOf(ary[i])===-1){
ary1.push(ary[i])
}
}
console.log(ary1);
ES6:Array.from(new Set(arr)) (返回的就是去重之後的)
複製程式碼
- 4、陣列的filter find方法
filter:用來過濾陣列(比較常用)
find:也是過濾陣列的,但是與filter不同,他返回的過濾出來的第一項,不是陣列,而filter是陣列
const list = [{'name':'1',index:1},{'name':'2'},{'name':'1'}]
let list2 = list.find(i=>i.name==='1')
let list3 = list.filter(i=>i.name==='1')
console.log(list);//[ { name: '1', index: 1 }, { name: '2' }, { name: '1' } ]
console.log(list2)//{ name: '1', index: 1 }
console.log(list3)//[ { name: '1', index: 1 }, { name: '1' } ]
複製程式碼
- 5、some every方法
const arr = [1, 2, 3, 4]
arr.every(d => d > 2)
<!--false 每一項都滿足條件則返回 true-->
arr.some(d => d > 2)
<!--true 只要有一項滿足條件則返回 true-->
複製程式碼
字串方法
- 模板字串
我們拼字串的時候可以使用模版字串,用處:拼url給後臺傳引數的時候
const foo = 'this is a' + example
可以優化寫法:
const foo = `this is a ${example}`
複製程式碼
- includes()方法 startsWith()方法 endsWidth()方法
let s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
複製程式碼
解構賦值
<!--首先有這麼一個物件-->
const props = {
className: 'tiger-button',
loading: false,
clicked: true,
disabled: 'disabled'
}
<!--當我們想要取得其中的2個值:loading與clicked時:-->
<!--es5-->
var loading = props.loading;
var clicked = props.clicked;
<!--es6-->
const { loading, clicked } = props;
複製程式碼
箭頭函式(ES6升級重點核心)。箭頭函式是ES6核心的升級項之一,箭頭函式裡沒有自己的this,這改變了以往JS函式中最讓人難以理解的this執行機制。
主要優化點:
- 1、箭頭函式內的this指向的是函式定義時所在的物件,
而不是函式執行時所在的物件。
ES5函式裡的this總是指向函式執行時所在的物件,這使得在很多情況下this的指向變得很難理解,尤其是非嚴格模式情況下,this有時候會指向全域性物件,這甚至也可以歸結為語言層面的bug之一。ES6的箭頭函式優化了這一點,它的內部沒有自己的this,這也就導致了this總是指向上一層的this,如果上一層還是箭頭函式,則繼續向上指,直到指向到有自己this的函式為止,並作為自己的this。 - 2、 箭頭函式不能用作建構函式,因為它沒有自己的this,無法例項化。
- 3、也是因為箭頭函式沒有自己的this,所以箭頭函式 內也不存在arguments物件。(可以用擴充套件運算子代替)
- 4、 函式預設賦值。ES6之前,函式的形參是無法給預設值得,只能在函式內部通過變通方法實現。ES6以更簡潔更明確的方式進行函式預設賦值。
import 和export
-
import引入的模組是靜態載入(編譯階段載入)而不是動態載入(執行時載入)。
-
import引入export匯出的介面值是動態繫結關係,即通過該介面,可以取到模組內部實時的值。
Promise 非同步操作
Promise 的then方法:
p.then(function (value) {
<!--完成態,value是上面resolve傳入的值-->
},
function (error) {
<!--失敗態,error是上面reject傳入的值-->
});
then()方法傳遞的兩個引數中:
<!--第一個引數(函式)對應著完成態的操作,也就是resolve時呼叫-->
<!--第二個引數(函式)對應著失敗態的操作,也就是reject時呼叫,第二個引數可以沒有-->
複製程式碼
錯誤處理:
var p = new Promise(function (resolve, reject) {
// ...
if(/* 非同步操作成功 */){
resolve(ret);
} else {
reject(error);
}
});
p.then(function (value) {
// 完成態
}, function (error) {
// 失敗態
});
複製程式碼
Promise的常見應用
- 使用Promise封裝一個ajax請求:
function getURL(url){
return new Promise(function(resolve,reject){
var req=new XMLHttpRequest();
req.open('GET',url,true);
req.onload=function(){
if (req.status==200) {
resolve(req.responseText);
}else{
reject(new Error(req.statusText))
}
};
req.onerror=function(){
reject(new Error(req.statusText));
};
res.send();
})
}
複製程式碼
- 非同步載入圖片
let preloadImage=(path)=>{
return new Promise(function(resolve,reject){
let img=new Image();
img.onload=resolve;
img.onerror=reject;
img.src=path;
})
}
複製程式碼
Promise.all()
- Promise.all()方法用於將多個Promise例項,包裝成一個新的Promise例項,例如:
var p = Promise.all([p1, p2, p3])
複製程式碼
新的Promise例項p的狀態由p1, p2, p3決定:
當p1, p2, p3的狀態都為完成態時,p為完成態。
p1, p2, p3中任一一個狀態為失敗態,則p為失敗態。
例子:
let a = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 2000)
})
let b = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3)
}, 2000)
})
Promise.all([a, b])
.then( (ret) => console.log(ret)) //2秒後,注意這裡返回的是陣列 [2,3]
.catch( err => console.log(err.toString()));
複製程式碼
async await :實際上是generator的語法糖,主要用來解決非同步問題的
async function test() {
const data = await axios.get('https://randomuser.me/api/')
console.log(data)
}
// 等同於
function test() {
axios.get('https://randomuser.me/api/').then(res => console.log(res)) // axios 也是 promise 物件
}
// 結合try/catch
async function test() {
try {
const data = await axios.get('https://randomuser.me/api/')
console.log(data)
} catch (err) {
console.log(err)
}
}
複製程式碼
參考網站: