国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6語法之 let 和 const

Xufc / 1441人閱讀

摘要:以往,在中聲明變量的唯一方式是使用關鍵字。這種行為會阻止變量被訪問,除非它們被聲明了。因此,將一個對象聲明為常量必須非常小心。之中,頂層對象的屬性與全局變量是等價的。從現在開始,建議放棄使用,改為使用和。

以往,在 JavaScript 中聲明變量的唯一方式是使用關鍵字 var。為了理解為何添加了 letconst,我們先看一個示例,了解使用 var 會帶來怎樣的麻煩。

var 變量提升

下面代碼中你認為運行 getClothing(false) 后的輸出是什么?

function getClothing(isCold) {
 if (isCold) {
   var freezing = "Grab a jacket!";
 } else {
   var hot = "It"s a shorts kind of day.";
   console.log(freezing);
 }
}

答案是輸出undifind, 本質上,在執行任何 JavaScript 代碼之前,所有變量都會被“提升”,也就是提升到函數作用域的頂部。因此在運行時,getClothing() 函數實際上看起來如下所示…

function getClothing(isCold) {
  var freezing, hot;
 if (isCold) {
   freezing = "Grab a jacket!";
 } else {
   hot = "It"s a shorts kind of day.";
   console.log(freezing);
 }
}
let 和 const

使用 letconst 聲明的變量解決了這種提升問題,因為它們的作用域是到塊,而不是函數。之前,當你使用 var 時,變量要么為全局作用域,要么為本地作用域,也就是整個函數作用域。

如果在代碼塊(用花括號 { } 表示)中使用 letconst 聲明變量,那么該變量會陷入暫時性死區(temporal dead zone),直到該變量的聲明被處理。這種行為會阻止變量被訪問,除非它們被聲明了。

下面例子中, 你認為運行 getClothing(false) 后的輸出是什么?

function getClothing(isCold) {
  if (isCold) {
    const freezing = "Grab a jacket!";
  } else {
    const hot = "It"s a shorts kind of day.";
    console.log(freezing);
  }
}

答案是 ReferenceError: freezing is not defined.

關于使用 let 和 const 的規則
let 和 const 還有一些其他有趣特性。

使用 let 聲明的變量可以重新賦值,但是不能在同一作用域內重新聲明。

使用 const 聲明的變量必須賦初始值,但是不能在同一作用域內重新聲明,也無法重新賦值。

let instructor = "James";
instructor = "Richard";
console.log(instructor); //Richard
const instructor = "James";
instructor = "Richard";
console.log(instructor); //SyntaxError: Identifier "instructor" has already been declared
使用案例

最大的問題是何時應該使用 letconst?一般法則如下:

當你打算為變量重新賦值時,使用 let

當你不打算為變量重新賦值時,使用 const

因為 const 是聲明變量最嚴格的方式,我們建議始終使用 const 聲明變量,因為這樣代碼更容易讀懂,你知道標識符在程序的整個生命周期內都不會改變。如果你發現你需要更新變量或更改變量,則回去將其從 const 切換成 let

const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內存地址不得改動。對于簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同于常量。但對于復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const只能保證這個指針是固定的,至于它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。

const foo = {};

// 為 foo 添加一個屬性,可以成功
foo.prop = 123;
foo.prop // 123

// 將 foo 指向另一個對象,就會報錯
foo = {}; // TypeError: "foo" is read-only

上面代碼中,常量foo儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把foo指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。

頂層對象的屬性

頂層對象,在瀏覽器環境指的是window對象,在 Node 指的是global對象。ES5 之中,頂層對象的屬性與全局變量是等價的。

從 ES6 開始,全局變量將逐步與頂層對象的屬性脫鉤。

var a = 1;
// 如果在 Node 的 REPL 環境,可以寫成 global.a
// 或者采用通用方法,寫成 this.a
window.a // 1

let b = 1;
window.b // undefined

上面代碼中,全局變量avar命令聲明,所以它是頂層對象的屬性;全局變量blet命令聲明,所以它不是頂層對象的屬性,返回undefined

var 該怎么辦?

還有必要使用 var 嗎?沒有了。

在某些情況下有必要使用 var,例如如果你想全局定義變量,但是這種做法通常都不合理,應該避免。從現在開始,建議放棄使用 var,改為使用 letconst

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92395.html

相關文章

  • ES6語法對象的擴展

    摘要:方法的第一個參數是目標對象,后面的參數都是源對象。這個對象的任何變化,都會反映到目標對象上面。方法將和合并成一個新對象,如果兩者有同名屬性,則的屬性值會覆蓋的屬性值。否則,對象的該屬性很可能不起作用。 對象字面量簡寫法 你可能寫過這樣的代碼:使用和所分配的變量名稱相同的名稱初始化對象。 let type = quartz; let color = rose; let carat = 2...

    SillyMonkey 評論0 收藏0
  • ES6語法解構賦值

    摘要:類似數組的對象都有一個屬性,因此還可以對這個屬性解構賦值。默認值解構賦值允許指定默認值當結構不成功時使用默認值。用途變量的解構賦值用途很多。有了解構賦值,取出這些值就非常方便。 原始操作 我們先看看下面的兩個代碼段,它們使用 ES6 之前的技巧提取數據: const point = [10, 25, -34]; const x = point[0]; const y = point[...

    Hancock_Xu 評論0 收藏0
  • 帶你入門 JavaScript ES6 (一)

    摘要:是國際組織于年月日發布的第六版,正式名為通常被成為或。二模版字面量提供一種簡單實現表達式嵌套的字符串字面量操作,簡而言之就是能夠以簡單的方法實現字符串拼接操作。 本文同步 帶你入門 JavaScript ES6 (一),轉載請注明出處。 ES6: 是 ECMA國際組織于 2015 年 6 月 17 日發布的 ECMAScript 第六版,正式名為 ECMAScript 2015,通常被...

    lindroid 評論0 收藏0
  • ES6學習手稿基本類型擴展

    摘要:它是一個通用標準,奠定了的基本語法。年月發布了的第一個版本,正式名稱就是標準簡稱。結語的基本擴展還有一些沒有在這里詳細介紹。 前言 ES6標準以及頒布兩年了,但是,好像還沒有完全走進我們的日常開發。這篇文章從ES6的基本類型擴展入手,逐步展開對ES6的介紹。 ECMAScript和JavaScript JavaScript是由Netscape創造的,該公司1996年11月將JavaSc...

    tommego 評論0 收藏0
  • 前端面試ES6篇(高產似母豬)

    摘要:這也是前端面試經常詢問的問題,經常問你出現了哪些新的特性,平時又使用過那些。 這也是前端面試經常詢問的問題,經常問你es6出現了哪些新的特性,平時又使用過那些。在編寫此教程的時候,第一句話往往就是面試常常問到的地方,然后后面就是他的詳細解釋,面試要求的內容我會用*標記出來。寫技術文檔是真的累啊,雖然是看別人的文檔,但是你得看很多,而且還得自己總結啊。所以說要是覺得對你有用還是幫我點個s...

    BlackMass 評論0 收藏0

發表評論

0條評論

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