成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

把JavaScript代碼改成ES6語法不完全指南

ninefive / 2734人閱讀

摘要:無論是靜態(tài)變量還是塊級變量,都不能重復(fù)定義,否則會報錯。當(dāng)存在多個嵌套的回調(diào)函數(shù)時,代碼的縮進(jìn)層級將會非常多,不利于閱讀。如果只有一個回調(diào)函數(shù),不涉及到錯誤處理,則不建議修改為的形式?;卣{(diào)函數(shù)常見于異步編程。

目錄
* 核心例子
* 修改成靜態(tài)變量(const)或塊級變量(let)
    * 開始修改
    * 疑問解釋(重復(fù)定義會發(fā)生什么)
    * 疑問解釋(let的塊級作用域是怎樣的)
    * 疑問解釋(const定義的變量在基礎(chǔ)數(shù)據(jù)類型和引用類型中的差異)
* 修改成Promise的形式
    * 預(yù)備知識(回調(diào)函數(shù)是什么)
    * 預(yù)備知識(如何把回調(diào)函數(shù)改為Promise)
    * 開始修改
* 修改成箭頭函數(shù)(Arrow Function)
    * 預(yù)備知識(箭頭函數(shù)是什么)
    * 預(yù)備知識(箭頭函數(shù)函數(shù)中的this是個坑)
    * 開始修改
* 修改拼接字符串成模板字符串
    * 預(yù)備知識(字符串的拼接方式)
    * 預(yù)備知識(改為模板字符串的方式)
    * 開始修改
* 修改成解構(gòu)的對象
* 修改成Class
核心例子

文中的例子,請?jiān)谧钚碌腃hrome中測試。關(guān)于配置ES6轉(zhuǎn)ES5的環(huán)境,不在本文探討的范疇。

// 定義一個學(xué)生構(gòu)造函數(shù)
var People = function(name, age) {
  this.name = name
  this.age = age
}

// 創(chuàng)建小明實(shí)例
var xiaoming = new People("xiaoming", 18)

// 定義一個考試函數(shù)
// 定義兩個回調(diào)函數(shù),在適當(dāng)?shù)臅r候把參數(shù)傳進(jìn)去
var examStart = function(callbackSucc, callbackFail) {
  var result = prompt("1+5=")
  if(result === "6") {
    callbackSucc("Awesome. Your answer is " + result)
  }
  else {
    callbackFail("You can try again. Your answer is " + result)
  }
}

// 開始考試
// 傳入的兩個回調(diào)函數(shù)分別處理結(jié)果
examStart(function(res) {
  console.log(res)
}, function(res) {
  console.log(res)
})
修改成靜態(tài)變量(const)或塊級變量(let)

當(dāng)你變量的值需要修改的時候,應(yīng)該使用塊級變量(let)。其他時候,使用靜態(tài)變量(const)。

無論是靜態(tài)變量(const)還是塊級變量(let),都不能重復(fù)定義,否則會報錯。

靜態(tài)變量(const)一旦定義,數(shù)據(jù)類型不可更改。但是引用類型,如Array,Object,都可以用相應(yīng)的原型方法對數(shù)據(jù)的內(nèi)部進(jìn)行操作。

開始修改

我們這里定義的變量都不需要修改,所以直接全部改為const。在項(xiàng)目中,判斷是改為const還是let有一個技巧,可以使用編輯器的變量復(fù)選功能(如,sublime中是雙擊變量名之后ctrl+d)。然后判斷代碼中是否對這個變量進(jìn)行過賦值,以及根據(jù)自己的判斷是否需要對這個變量進(jìn)行修改,不需要則用const。

// 修改一  var ==> const
const Student1 = function(name, age) {
  this.name = name
  this.age = age
}

// 修改二  var ==> const
const xiaoming1 = new Student1("xiaoming", 18)

// 修改三  var ==> const
const examStart1 = function(callbackSucc, callbackFail) {
  // 修改四  var ==> const
  const result = prompt("1+5=")
  if(result === "6") {
    callbackSucc("Awesome. Your answer is " + result)
  }
  else {
    callbackFail("You can try again. Your answer is " + result)
  }
}

examStart1(function(res) {
  console.log(res)
}, function(res) {
  console.log(res)
})
疑問解釋(重復(fù)定義會發(fā)生什么)
const author = "bw2"
const author = "bw3"  // Uncaught SyntaxError: Identifier "author" has already been declared
let author = "bw4"  // Uncaught SyntaxError: Identifier "author" has already been declared
疑問解釋(let的塊級作用域是怎樣的)
// let定義的變量存在塊級作用域
if(true) {
  let test1 = 2333
}
console.log(test1)  // Uncaught ReferenceError: t is not defined


// var定義的變量不存在,會直接成為全局變量
if(true) {
  var test2 = 2333
}
console.log(test2)  // 2333
疑問解釋(const定義的變量在基礎(chǔ)數(shù)據(jù)類型和引用類型中的差異)

開始例子之前,先回顧以下基礎(chǔ)數(shù)據(jù)類型。Number、String、Boolean、null、undefined、Symbol。其中Symbol是ES6新加的。除基礎(chǔ)數(shù)據(jù)類型外,皆為引用類型。常見的引用類型是Array,Object。

// const定義的變量值是基礎(chǔ)數(shù)據(jù)類型時,不能修改值,也不能修改類型
const num = 2333
num = 2334  // Uncaught TypeError: Assignment to constant variable.
num = ""  // Uncaught TypeError: Assignment to constant variable.

// const定義的變量值是引用類型時,可以修改值
const obj = {}
obj.test = 2333
console.log(obj.test)  // 2333

const arr = []
arr.push(1)
console.log(arr)  // [1]
修改成Promise的形式

從應(yīng)用的角度上來講,Promise的主要作用是可以把回調(diào)函數(shù),改為鏈?zhǔn)秸{(diào)用的模式。

當(dāng)存在多個嵌套的回調(diào)函數(shù)時,代碼的縮進(jìn)層級將會非常多,不利于閱讀。這時Promise就登場了。

如果只有一個回調(diào)函數(shù),不涉及到錯誤處理,則不建議修改為Promise的形式。

預(yù)備知識(回調(diào)函數(shù)是什么)

回調(diào)函數(shù)是指,定義一個函數(shù),傳入的參數(shù)是一個函數(shù)。然后在函數(shù)中特定的位置,執(zhí)行這個傳入的函數(shù),并將需要用到的數(shù)據(jù),作為參數(shù)傳入?;卣{(diào)函數(shù)常見于異步編程。比如發(fā)送Ajax請求和NodeJS中的異步文件操作。百聞不如一見,我們看個最簡單的例子吧。

// 定義一個支持傳入回調(diào)函數(shù)的函數(shù)
function fun1(callback) {
  // 執(zhí)行傳入的函數(shù),并將值2333作為參數(shù)傳入
  callback(2333)
}

// 執(zhí)行定義的函數(shù)
fun1(function(res){
  // 輸出傳入的參數(shù)
  console.log(res)
})
預(yù)備知識(如何把回調(diào)函數(shù)改為Promise)

這里只是為了舉個例子,不涉及錯誤處理的時候,不建議修改為Promise。

function fun2() {
  // 在函數(shù)中返回一個Promise對象
  // resolve和reject都是函數(shù)
  return new Promise(function(resolve, reject){
    // resolve函數(shù)中的參數(shù)將會出現(xiàn)在.then方法中
    // reject函數(shù)中的參數(shù)將會出現(xiàn)在.ctch方法中
    resolve(2333)
  })
}

fun2().then(function(res){
  console.log(res)  // 2333
})
開始修改

Promise是通過resolve和reject來分別把正確結(jié)果,和錯誤提示放在鏈?zhǔn)秸{(diào)用的.then和.catch方法里。

const examStart2 = function() {
  // 返回一個Promise對象
  return new Promise(function(resolve, reject) {
    var result = prompt("1+5=")
    if(result === "6") {
      resolve("Awesome. Your answer is " + result)
    }
    else {
      reject("You can try again. Your answer is " + result)
    }
  })
}
examStart2()
.then(function(res) {
  console.log(res)
})
.catch(function(err) {
  console.log(err)
})
修改成箭頭函數(shù)(Arrow Function) 預(yù)備知識(箭頭函數(shù)是什么)

箭頭函數(shù)是一個用來幫我們簡化函數(shù)結(jié)構(gòu)的一個小工具。

// 普通函數(shù)形式
const add1 = function(a, b) {
   return a + b
}
add1(1, 2)  // 3

// 箭頭函數(shù)形式
const add2 = (a, b) => a + b
add2(1, 2)  // 3
預(yù)備知識(箭頭函數(shù)函數(shù)中的this是個坑)
// 箭頭函數(shù)沒有獨(dú)立的this作用域
const obj1 = {
  name: "bw2",
  showName: () => {
    return this.name
  }
}
obj1.showName()  // ""

// 解決方案:改為function模式
const obj2 = {
  name: "bw2",
  showName: function() {
    return this.name
  }
}
obj2.showName()  // "bw2"
開始修改
var examStart3 = function() {
  // 修改一
  return new Promise((resolve, reject) => {
    var result = prompt("1+5=")
    if(result === "6") {
      resolve("Awesome. Your answer is " + result)
    }
    else {
      reject("You can try again. Your answer is " + result)
    }
  })
}
// 修改二
examStart3().then((res) => console.log(res)).catch((err) => console.log(err))
修改拼接字符串成模板字符串 預(yù)備知識(字符串的拼接方式)
const xh1 = "xiaohong"
console.log("I"m " + xh1 + ".")  // I"m xiaohong.
預(yù)備知識(改為模板字符串的方式)

字符串模板使用的不再是單引號了,是在英文輸入狀態(tài)下的`鍵(ESC下面那個)。

const xh2 = "xiaohong"
console.log(`I"m ${xh2}.`)  // I"m xiaohong.
開始修改
var examStart4 = function() {
  return new Promise((resolve, reject) => {
    var result = prompt("1+5=")
    if(result === "6") {
      // 修改一
      resolve(`Awesome. Your answer is ${result}`)
    }
    else {
      // 修改二
      reject(`You can try again. Your answer is ${result}`)
    }
  })
}
examStart4().then((res) => console.log(res)).catch((err) => console.log(err))
修改成解構(gòu)的對象

對象解構(gòu)常用在NodeJS導(dǎo)入包內(nèi)的某個模塊時。對于自己寫的對象,如果需要進(jìn)行解構(gòu),則要確保對象內(nèi)的命名被解構(gòu)出來不會造成沖突。這里是為了舉例子方便,沒有使用很獨(dú)特的命名。

const People2 = function(name, age) {
  this.name = name
  this.age = age
}
const xiaoming2 = new People2("xiaoming2", 18)

// 開始結(jié)構(gòu)
const {name, age} = xiaoming2
// 現(xiàn)在可以獨(dú)立訪問了
console.log(name)  // xiaoming2
console.log(age)  // 18
修改成Class

類是一個語法糖,但是這并不妨礙我們?nèi)ナ秤盟?/p>

在React中,模板的定義,通常是類,生命周期方法也是寫在類中。

class People3 {
  constructor(name, age){
    this.name = name
    this.age = age
  }
  showName() {
    return this.name
  }
}

const xiaoming3 = new People3("xiaoming3", 18)
console.log(xiaoming3)  // People {name: "xiaoming3", age: 18}
console.log(xiaoming3.showName())  // xiaoming3

不過癮?文章已經(jīng)結(jié)束了。但是關(guān)于ES6的探索,還會繼續(xù)保存更新。

來關(guān)注一下前端進(jìn)階指南微信公眾號吧:

另外我也創(chuàng)了一個對應(yīng)的QQ群:660112451,歡迎一起交流。

注:以上ES6語法為作者日常使用較為頻繁的語法,未將所有ES6語法囊括在內(nèi)。感謝你的閱讀。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88469.html

相關(guān)文章

  • 前端練級攻略(第二部分)

    摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個實(shí)踐的重點(diǎn)是把你在前端練級攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級攻略 第二部分,第一部分請看下面: 前端練級攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語言,如...

    BWrong 評論0 收藏0
  • [譯]JavaScript ES6箭頭函數(shù)指南

    摘要:以下例子的目的是使用來展示一個每秒都會更新的時鐘當(dāng)嘗試在的回調(diào)中使用來引用元素時,很不幸,我們得到的只是一個屬于回調(diào)函數(shù)自身上下文的。 前言 胖箭頭函數(shù)(Fat arrow functions),又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>...

    makeFoxPlay 評論0 收藏0
  • [譯]JavaScript ES6 class指南

    摘要:前言又稱通過一些新的關(guān)鍵字,使類成為了中一個新的一等公民。類聲明在中,有兩個聲明類的方式。在使用了新的關(guān)鍵字后在底層,所做的,也只是將這個方法添加為構(gòu)造函數(shù)的一個屬性。在想要調(diào)用父類的構(gòu)造函數(shù)時,你可以簡單地將關(guān)鍵字視作一個函數(shù)使用,如。 前言 EcmaScript 2015 (又稱ES6)通過一些新的關(guān)鍵字,使類成為了JS中一個新的一等公民。但是目前為止,這些關(guān)于類的新關(guān)鍵字僅僅是建...

    CoderDock 評論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&前端面試資源匯總

    摘要:特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...

    princekin 評論0 收藏0
  • 【譯】前端練級攻略

    摘要:由于系統(tǒng)變得越來越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開始學(xué)習(xí)前端開發(fā)的時候。我看到了很多文章及...

    wuyumin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<