ES6

let 和 const

let 的特點

  • let 的作用域在最近的 {} 之間
  • 如果在 let a 之前使用 a 失驶,那么報錯(Temp Dead Zone)
  • 如果重復(fù)let a , 會報錯
  • let 存在塊級作用域

let 循環(huán)

for(let i = 0; i < 5;i++){
console.log(i)  //  塊里面的i  = 圓括號里面 i 的值
}

console.log(i) // Uncaught ReferenceError: i is not defined

const 特點

  • const 的作用域在最近的 {} 之間
  • 如果在 const a 之前使用 a ,那么報錯(Temp Dead Zone)
  • 如果重復(fù)const a 荆几, 會報錯
  • 只有一次賦值機(jī)會,并且必須在聲明的時候立馬賦值
  • const聲明創(chuàng)建一個值的只讀引用唧取,在引用內(nèi)容是對象的情況下航夺,可以改變對象的內(nèi)容:
let user = { name: 'ZhangSan', age: 21 };
const USER_A = user;
console.log("USER_A :", USER_A ); // user: {name: "ZhangSan", age: 21}
user.age = 18;
console.log("USER_A :", USER_A ) // user: {name: "ZhangSan", age: 18}

解構(gòu)賦值

數(shù)組的解構(gòu)賦值

  • 匹配 [ b, a ] = [ a, b ]
let [a,b,c] = [1,2,3] ;
console.log(a,b,c) //  1  2  3 

let[a,[b],c] = [2,[3],4];
console.log(a,b,c)  // 2,3,4
let [a,b,...rest] = [10,20,30,40,50]
console.log(rest)   //   [30, 40, 50]
  • 交換變量
let a = 1;
let  b = 2;
[a,b] = [b,a];
console.log(a,b)    //  2 1
  • 默認(rèn)值
let [a,b=2] = [3];
a // 3
b // 2    使用默認(rèn)值
let [a,b=2] = [3,4];
a // 3
b //  4   有對應(yīng)數(shù)值,使用對應(yīng)數(shù)值

undefined 和null 的區(qū)別:

var [a,b,c] = [1,2]
console.log(a,b,c) //  1  2  undefined 

var [a,b,c] = [1,2, null]
console.log(a,b,c) //  1  2  null 
let[a=2,b=3] = [undefined, null]
a // 2
b //  null
  • 函數(shù)傳參
let arr = [1,2];
function test([a,b]) {
  console.log("a: " + a); // a: 1
  console.log("b: " + b) //  b: 2
}
test(arr)

對象的解構(gòu)賦值

  • 對象匹配 let { a, b, c } = objABC
let { name , age} = {name: 'xxx',age: 18};
name //   xxx
age // 18
  • 對象匹配的同時重命名
let { name : username, age} = {name: 'xxx',age: 18};
username //   xxx
age // 18
  • 對象匹配 —— 改變原來的值
let name = 'ZhangSan';
let obj  = {name: 'xxx',age: 18};
console.log(name); //   ZhangSan
({ name, age } = obj ) ; // 這里要用()包住腥光,因為大括號會被解析成一個代碼塊報錯
console.log(name) //  xxx
  • 指定默認(rèn)值并重命名
let {a: A=1, b=2 } = {a: 99}
console.log(A) //  99 
console.log(b) //  2
  • 對象淺拷貝
let obj1  = { name: 'xxx',age: 18,others: {
fruits: 'xx1', book: 'wrrr' }   };
let obj2 = {...obj1};
console.log(obj2)    //  {name: "xxx", age: 18,others: {fruits: 'xx1', book: 'wrrr' }}
  • 對象合并 ...
let obj1  = {p1: 1, p2: 2};
let obj2 = {p2: 30, p3: 99};
let obj3 = Object.assign({},obj1,obj2);
console.log(obj3) //     {p1: 1, p2: 30, p3: 99}
let obj4 = {...obj1,...obj2};
console.log(obj4) //   {p1: 1, p2: 30, p3: 99}

參數(shù)處理

默認(rèn)參數(shù)值

函數(shù)默認(rèn)參數(shù)允許在沒有值或undefined被傳入時使用默認(rèn)形參关顷。

function sum(a=0,b=0){
       console.log('a:'+a);
       console.log('b:'+b);
        return a + b
}
sum(1) //  a:1     b:0   1
sum(2,6) //  a:2  b:6  8

上面的代碼等價于:

function sum(a,b){
      a = a || 0;
      b = b || 0;
       console.log('a:'+a);
       console.log('b:'+b);
        return a + b
}

剩余參數(shù)

展開運算符

先來看一個數(shù)組的擴(kuò)展:

var a = [1,2,3];
console.log(...a)  ; //  1 2 3
var b = [...a,99,88];
console.log(b);   //  對數(shù)組進(jìn)行擴(kuò)展 [1, 2, 3, 99, 88]
var c = b.concat(77,66);
console.log(c); // [1, 2, 3, 99, 88, 77, 66]
let arr1 = [1,2,3,4,5,6];
let [a,b,c,...arr2] = arr1;
console.log(arr2) //   [4, 5, 6]

... 相當(dāng)于把數(shù)組拆開

  • 函數(shù)參數(shù)的擴(kuò)展
function max(arr){
return Math.max(...arr)
};   // 求最大值
max([1,22,44,66,5,66,77,3,22,33,11,34])  //  77
function sort(...arr){
return arr.sort()
};
sort(1,2,5,3) //   [1, 2, 3, 5]
  • 類數(shù)組對象轉(zhuǎn)數(shù)組
    ES5 寫法是:
let newArr = Array.prototype.slice.call(ArrayLike)

ES6 寫法如下:

let items = document.querySelectorAll('li');
Array.from(items).forEach((item) => console.log(item.innerText));

或者

let items = document.querySelectorAll('li');
[...items].forEach((item) => console.log(item.innerText))

模板字面量

多行字符串

let str = `
line1,
line2,
line3
`;      //    注意這里的 ` 不是單引號
str //  "
line1,
line2,
line3
"

字符串插值

let city = ' xxx';
let str =  ` Hi 
Welcome to ${city}.
`      //  同樣的, 這里的 ` 不是單引號
str //  " Hi 
Welcome to  xxx.
"

可以用來拼接HTML:

var data = [1,2,3,4];
var liArr = data.map((item) => `<li class="xxx"> 內(nèi)容 ${item}</li>`
).join('');
console.log(liArr);  // <li class="xxx"> 內(nèi)容 1</li><li class="xxx"> 內(nèi)容 2</li><li class="xxx"> 內(nèi)容 3</li><li class="xxx"> 內(nèi)容 4</li>

var html = `<ul>${liArr}</ul>`;
console.log(html)   //    <ul><li class="xxx"> 內(nèi)容 1</li><li class="xxx"> 內(nèi)容 2</li><li class="xxx"> 內(nèi)容 3</li><li class="xxx"> 內(nèi)容 4</li></ul>

帶標(biāo)簽的模板字面量

如果一個模板字符串由表達(dá)式開頭武福,則該字符串被稱為帶標(biāo)簽的模板字符串议双,該表達(dá)式通常是一個函數(shù),它會在模板字符串處理后被調(diào)用捉片,在輸出最終結(jié)果前平痰,都可以通過該函數(shù)來對模板字符串進(jìn)行操作處理汞舱。

let name = 'xxx';
let  score = 60;
let fn = function (){
console.log(arguments)
}
fn `${name} 的成績是 ${score}`

運行結(jié)果如下:

image.png

let name = 'xxx';
let  score = 60;
let fn = function (){
   let str = arguments[0];
   let arg1 = arguments[1];
   let arg2 = arguments[2];
   if(arg2 >= 80){
        return arg1 + str +arg2 + ',再接再厲哦宗雇!'
    } else{
        return arg1 + str + arg2 +  '昂芜,要加油了哦!'
    }
}
fn `${name} 的成績是 ${score}`
//   "xxx, 的成績是 ,60赔蒲,要加油了哦泌神!"

把 name 和 score 改下:

name = 'x2';score = 90;
fn `${name} 的成績是 ${score}`
//  "x2, 的成績是 ,90,再接再厲哦舞虱!"

原始字符串

在標(biāo)簽函數(shù)的第一個參數(shù)中欢际,存在一個特殊的屬性raw,我們可以通過它來訪問模板字符串的原始字符串矾兜,而不經(jīng)過特殊字符的替換损趋。

function tag(strings) {
  console.log(strings.raw[0]);
}

tag`string text line 1 \n string text line 2`; 
 // string text line 1 \n string text line 2

原有字面量增強(qiáng)

  • 更安全的二進(jìn)制字面量(0b1111101)
  • 更安全的八進(jìn)制字面量(0o767)
  • 字符串支持 Unicode
    -- String.fromCodePoint
    -- String.prototype.codePointAt
  • 正則表達(dá)式字面量添加 Unicode 支持(u 標(biāo)記)
  • 正則表達(dá)式添加 y 標(biāo)記,支持粘滯匹配

對象屬性加強(qiáng)

屬性定義支持短語法 obj = { x, y }

ES5寫法:

var a = 1;
var b = 4;
var obj = {a:a,b:b}  ;
obj  //  {a: 1, b: 4}

ES6寫法:

let a = 1;
let b = 4;
let obj = {a,b}  ;
obj //   {a: 1, b: 4}

屬性名支持表達(dá)式

動態(tài)屬性名
原來的寫法:

var name = 'a';
var obj = {};
obj[name] = 123;
obj //  {a: 123}

ES6:

let name = 'a';
let obj = {[name]: 123};
obj   //    {a: 123}

屬性修飾符Object.defineProperty()

a === 1 && a ===2 && a === 3 問題

var  i = 0;
Object.defineProperty(window,'a',{
    get(){
      i += 1;
      return i
    }
})

a === 1 && a ===2 && a === 3   //  true

類 class

var Slider = {
append: function(){
      console.log(1)
     },
render: function(){
     console.log(2)
  }
}

ECMAScript 2015引入了一種對象方法的簡短寫法焕刮, "function" 關(guān)鍵字可以丟掉:

var Slider = {
append(){
   console.log(1)
  },
render(){
  console.log(2)
   } 
}

構(gòu)造函數(shù)

class Cat {
constructor(name,personality){
this.name = name;
this.personality = personality;
} //  注意: 這里沒有逗號
sayHi (){   //  這個函數(shù)會放在原型上
      console.log(`Hi,I'm a ${this.name}, I'm ${this.personality}`);
    }
}

var BritishShorthair  =  new Cat('BritishShorthair','docile');
console.log(BritishShorthair); //  {name: "BritishShorthair", personality: "docile"}
BritishShorthair.sayHi(); //  Hi,I'm a BritishShorthair, I'm docile

上面的代碼等價于

function Cat(name,personality){
this.name = name;
this.personality = personality;
};
Cat.prototype.sayHi = function(){
console.log(`Hi,I'm a ${this.name}, I'm ${this.personality}`)
};
var BritishShorthair  =  new Cat('BritishShorthair','docile');
console.log(BritishShorthair); //   Cat {name: "BritishShorthair", personality: "docile"} 
BritishShorthair.sayHi(); //   Hi,I'm a BritishShorthair, I'm docile

class 共有屬性不能是非函數(shù):

  • 可以用原型寫
    xxx.prototype.race = 'animal'
  • get
class Cat {
 constructor(name,personality){
   this.name = name;
   this.personality = personality;
   }
get race (){
  return 'animal'
  }
}
let BritishShorthair  =  new Cat('BritishShorthair','docile');
BritishShorthair.race  //   animal

但是 不能通過 BritishShorthair.race = newvalue來改

image.png

所以又要用到 set

class Cat {
 constructor(name,personality){
   this.name = name;
   this.personality = personality;
   this._race = `animal`;
   }
get race (){
  return this._race
  }
set race(value){
  this._race = value
 }
}

let BritishShorthair  =  new Cat('BritishShorthair','docile');

再修改就發(fā)現(xiàn)改成功了:


image.png

如果想讓屬性只讀舶沿,就不寫set


ES6 模塊

用 import 和 export 寫好之后,
可以用webpack 或者 parcel (推薦) 打包 配并,然后引入

<script type="module" src="javascripts/app.js"></script>  <!-- 已支持 ES6 模塊的瀏覽器 -->
<script nomodule src="dist/app.js"></script>              <!-- 不支持 ES6 模塊的瀏覽器 -->

其他:
箭頭函數(shù)
JS 中的 Symbol 是什么括荡?

Generator函數(shù)的含義與用法
Thunk函數(shù)的含義與用法
co函數(shù)庫的含義與用法
async函數(shù)的含義與用法
tj/co

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溉旋,隨后出現(xiàn)的幾起案子畸冲,更是在濱河造成了極大的恐慌,老刑警劉巖观腊,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑闲,死亡現(xiàn)場離奇詭異,居然都是意外死亡梧油,警方通過查閱死者的電腦和手機(jī)苫耸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡陨,“玉大人褪子,你說我怎么就攤上這事∑澹” “怎么了嫌褪?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胚股。 經(jīng)常有香客問我笼痛,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任缨伊,我火速辦了婚禮摘刑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倘核。我一直安慰自己泣侮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布紧唱。 她就那樣靜靜地躺著活尊,像睡著了一般漏益。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铜犬,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天癣猾,我揣著相機(jī)與錄音余爆,去河邊找鬼蛾方。 笑死桩砰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硼莽。 我是一名探鬼主播沉删,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砖茸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起货葬,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤震桶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹲姐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柴墩,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡江咳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年歼指,在試婚紗的時候發(fā)現(xiàn)自己被綠了踩身。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轨奄,靈堂內(nèi)的尸體忽然破棺而出挪拟,到底是詐尸還是另有隱情击你,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布惯雳,位于F島的核電站,受9級特大地震影響鸿摇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一潮孽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧往史,春花似錦仗颈、人聲如沸椎例。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粟矿。三九已至凰棉,卻和暖如春陌粹,著一層夾襖步出監(jiān)牢的瞬間撒犀,已是汗流浹背或舞。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工邮破, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留诈豌,地道東北人抒和。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓摧莽,卻偏偏與公主長得像庙洼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镊辕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 三油够,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn),只要將碼點放入大括號征懈,就能正確解讀該字符石咬。有了這...
    eastbaby閱讀 1,534評論 0 8
  • 一、ES6簡介 ? 歷時將近6年的時間來制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,072評論 8 25
  • 1卖哎、新的聲明方式 以前我們在聲明時只有一種方法鬼悠,就是使用var來進(jìn)行聲明虏束,ES6對聲明的進(jìn)行了擴(kuò)展,現(xiàn)在可以有三種...
    令武閱讀 1,009評論 0 7
  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,781評論 0 1
  • “以后你做了父母就知味道啦厦章。”好友總是一番養(yǎng)娃言語之后照藻,便來這一句結(jié)語袜啃。 隨著年齡的增長,以及身邊朋友陸續(xù)都有了小...
    Hi云上太陽閱讀 302評論 2 3