ES6新特性
1let和const:
作用域: 全局,函數, eval(只有在ES5的嚴格模式才會出現)
const定義常量與使用let 定義的變量相似:
- 二者都是塊級作用域
- 都不能和它所在作用域內的其他變量或函數擁有相同的名稱
兩者還有以下兩點區別:
- const聲明的常量必須初始化,而let聲明的變量可以不用初始化
- const 定義常量的值不能通過再賦值修改,也不能再次聲明,但是它定義的對象和數組可以通過屬性值或索引改變。而 let 定義的變量值可以修改。這是因為關鍵字 const 有一定的誤導性。它沒有定義常量值。const定義了對值的常量引用。因此,我們不能更改常量原始值,但我們可以更改常量對象的屬性。
var和let在函數體內使用,它們在作用域都是局部的;
var和let在函數體外或代碼塊外使用,它們的作用域都是全局的;
代碼提升:var聲明的變量會提升到頂端,即可以在聲明變量之前就使用它,但是使用時它不會被初始化,它的值是undefined。
通過let或const定義的變量不會被提升到頂端,在聲明let或const變量之前就使用它會導致ReferenceError。
let不影響作用域鏈: let定義的變量,如果某作用域內沒有該變量的定義和聲明,那它會向外層去找let的定義,在循環中非常適用,而var不行,var定義循環的值會不受作用域的影響,從而影響每次變量的值的調用。
2.解構賦值
ES6允許按照一定模式從數組和對象中提取值,對變量進行賦值,這被稱為解構賦值
數組的比較簡單。
對于對象的解構賦值:它的解構賦值名字必須和對象中的屬性名相同。
如上面的xiaopin就是相同的才可以解構賦值。
3.引入新的聲明字符串的方式:``反引號
主要方便了變量的拼接: 記得要在``中使用{}來將變量放在其中。
4.ES6簡化了對象的定義方法:
比如上面的improve方法,原來是improve :function(){}, 省略了:function ,書寫更加方便了
5箭頭函數 (=>) 等于號和大于號的結合體
ES6允許使用箭頭來定義函數;
使用箭頭函數,this是靜態的,它始終指向函數在聲明時所在作用域下的this的值,所以使用call方法調用時,它的this值并不改變。 最重要的 特點

直接調用的值都是 尚硅谷。
call方法調用:
getName.call(school);// ATGUIGU,因為是getName這個函數調用的,school作為參數,成為了這個調用方法的主體,所以是school的屬性name
getName2.call(school);// 尚硅谷 ,因為在 聲明時,getName2是在window作用域中聲明的,箭頭函數就指向聲明時的作用域。
不能作為構造實例化對象;
在箭頭函數中不能使用arguments變量;
箭頭函數的簡寫:1 可以省略小括號,當 形參有且只有一個的時候
2可以省略{},當代碼體只有一條語句的時候,此時return也必須省略,而且語句的執行結果就是函數的返回值。

6ES6允許給函數的形參賦值初始值

7rest參數

8擴展運算符![]()
//symbol
let s1 = Symbol();
let s = Symbol('lala');
let s2 = Symbol('lala');
console.log(s === s2) // false
let s4 = Symbol.for()
let s5 = Symbol.for('out');
let s6 = Symbol.for('out')
let k1 = Symbol.for();
let k2 = Symbol.for()
// alert(k1 === k2) //true
console.log(s5 === s6) // true
// let resu=s1+100; //error
// let res1=s1+'100';//error
// let res2=s1>100 ; //error
// Symbol 創建對象屬性
//方法1
let game = {
name: '俄羅斯方塊',
up: 'shang',
down: 'xia'
}
let methods = {
up: Symbol(),
down: Symbol()
}
game[methods.up] = function () {
console.log('我向上')
}
game[methods.down] = function () {
console.log('我立刻向下')
}
game[methods.up]();
//方法2
let youxi = {
name: '劇本殺',
[Symbol('say')]: function () {
console.log('我發言。')
},
[Symbol('tuili')]: function () {
console.log('我推理。。')
}
}
console.log(youxi);
//需要自定義遍歷數據的時候要想到迭代器
//迭代器 Iterator是一種接口,為各種不同的數據結構提供統一的訪問機制,任何數據結構主要
//部署了Iterator接口,就可以完成遍歷操作。
// 新的遍歷方法: for...of
//原理是創建了指針對象,用next調用起始位置,接下來不斷調用next方法,
//指針一直往后移動,直到指到最后一個成員。 每次調用next方法返回一個包含value和done屬性的對象。
const xiyou = ['唐僧', '孫悟空', '豬八戒', '沙僧', '白龍馬']
for (let v of xiyou) {
console.log(v)//唐僧, 孫悟空, 豬八戒, 沙僧, 白龍馬
}
for (let v in xiyou) {
console.log(v) // 01234
console.log(xiyou[v])//唐僧, 孫悟空, 豬八戒, 沙僧, 白龍馬
}
//自定義遍歷數據
const f4 = {
name: 'EDG',
player: [
'777',
'uzi',
'Ming',
'xiaohu',
'theShy'
],
[Symbol.iterator]() {
//索引變量
let index = 0;
return {
next: () => {
if (index < this.player.length) {
const result = { value: this.player[index], done: false }
index++;
return result;
} else {
return { value: undefined, done: true }
}
}
}
}
}
for (let v of f4) {
console.log(v)
}
9.promise 用于解決回調地獄
Promise一共有三種狀態: 未決定的:pending; 成功:resolved、fulfilled ;失敗:rejected
異步編程的新解決方案。多層回調函數的相互嵌套, 就形成了回調地獄, promise就用于解決這個問題.
因為promise支持鏈式調用即 .then()方法,鏈式調用就是從上往下的回調,所以解決了回調地獄。
promise.race()只要完成一個異步操作,就會執行下一步的.then操作(賽跑機制)
promise.all() 等所有的異步操作完成后,才會執行下一步的.then操作(等待機制)
async 和await 用來簡化promise的異步操作, 而且得到的結果是相應文件的內容了.
10.set 集合 typeof是對象
可以將數組轉化為這個數據結構,然后會自動去重,再用擴展運算符... 把它轉回數組 。
let arr= [2,3,1,77,77,8,8,2,3,5]
let newArr=[...new Set(arr)]
console.log(newArr) // [2,3,1,77,8,5]



浙公網安備 33010602011771號