ES6(二)let 和 const

let 命令

let 和 var 差不多,只是限制了有效范圍。

先定義后使用

不管是什么編程語言,不管語法是否允許,都要秉承先定義,然后再使用的習(xí)慣,這樣不會出幺蛾子。以前JavaScript比較隨意,可以不定義直接使用,這樣很容易亂,let 就要嚴(yán)格一些,let定義的變量,在定義之前是不可以用的,會報錯。

      console.log(v)
      var v = 1;
      
      console.log(a)
      let a = 1;

運(yùn)行結(jié)果:


999-let02.png

var定義的變量不會報錯,但是let定義的變量會報錯。let更加的嚴(yán)謹(jǐn)。

let 的有效范圍

let 只在代碼塊內(nèi)部有效。我們舉個例子來區(qū)分一下

 function test() {
      let arr = [1,2,3]
      for (var i = 0; i<arr.length;i++) {
        console.log(i)
      }
      console.log(i) // 3

      for (let j = 0; j<arr.length;j++) {
        console.log(j)
      }
      console.log(j) // j is not defined

    }

運(yùn)行結(jié)果:


999-let03.png

var 定義的 i ,循環(huán)結(jié)束后依然可以訪問,但是let 定義的 j,出了循環(huán)就無效了。

let的塊級特性,寫循環(huán)就更方便了,比如這樣:

      for (let j = 0; j<arr.length;j++) {
        console.log(j)
      }
      for (let j = 0; j<arr.length;j++) {
        console.log(j)
      }
      for (let j = 0; j<arr.length;j++) {
        console.log(j)
      }
      for (let j = 0; j<arr.length;j++) {
        console.log(j)
      }

多次循環(huán)都可以直接定義同樣的變量名字,比用var方便多了。
只是現(xiàn)在似乎也不需要這么寫循環(huán)了,ES6對數(shù)組又增加了很多新的方法。

let 的變量可以修改

let 定義的變量,不僅可以改值,還可以改類型,這一點(diǎn)繼承了JavaScript的非fang常fei靈zi活wo 的特點(diǎn)。

      let aa = 0
      console.log(aa) //
      aa = 'aaa'
      console.log(aa) //
      aa = {name: 'ttt'}
      console.log(aa) //
      aa = [5,6,7]
      console.log(aa) //
      aa = function () {
        console.log('變成函數(shù)')
      }
      console.log(aa) //

運(yùn)行結(jié)果:


999-let.png

如果不能改類型的話,可以使用const 來定義。

const 命令

const 聲明一個只讀的常量,一旦聲明,常量的值就不能改變。

只讀常量嗎?

看vue的代碼里面,各種const定義的對象,哪個也不像不能改的呀。
其實(shí)這里不能改,指的是“地址(里的指針)”不能改。
只要保證地址不變,地址(里的指針)對應(yīng)的內(nèi)容是可以隨意的。

那么具體怎么區(qū)分呢?

  • 先來看看簡單類型
      const aa = 1;
      console.log(aa) //
      aa = 2; // 報錯
      console.log(aa) //

運(yùn)行結(jié)果:


9999-const01.png

修改簡單類型的值的時候會報錯。

  • 再來看看數(shù)組的情況
      const arr = [1,2,3]
      console.log(arr) // [1, 2, 3]
      arr.push(5)
      console.log(arr) // [1, 2, 3, 5]
      arr[0] = 111
      console.log(arr) // [111, 2, 3, 5]

      const arr2 = [4,5,...arr]
      console.log(arr2) // [4, 5, 111, 2, 3, 5]

      const arr3 = [7,8] // 7,8 被覆蓋
      Object.assign(arr3, arr)
      console.log(arr3) // [111, 2, 3, 5]

      const arr4 = [7,8] //
      arr4 = [...arr] // 報錯 
      console.log(arr4) //

      arr = [7,8,9] // 報錯
      console.log(arr) //

運(yùn)行結(jié)果如下:


9999-const03.png

數(shù)組自帶的各種函數(shù)都是可以運(yùn)行的,不會報錯,但是直接給數(shù)組賦值就不行了。因為前者沒有改變地址,只是在地址里面增加了新的數(shù)據(jù),而后者是改了一個新的地址。

  • 再看看對象的情況
      const foo = {title: '我是標(biāo)題'}
      console.log(foo) //
      
      foo.name = '新名稱'
      console.log(foo) // 可以修改屬性值
      
      foo.title = '新標(biāo)題'
      console.log(foo) // 可以增加屬性
      
      Object.assign(foo, {age:65})
      console.log(foo) // 合并對象
      
      foo = {newTitle: '這個就不行了'} // 報錯

運(yùn)行結(jié)果:


9999-const04.png

只要地址(里的指針)沒變,那么就可以隨心所欲了。

參考書目

《ES6 標(biāo)準(zhǔn)入門》第3版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容