?“我唯一知道的就是我一無所知。” - 蘇格拉底
目錄
- 塊級作用域:
- var、let、const的對比:
- Object.freeze():
塊級作用域:
塊級作用域指由 {} 包圍的代碼塊(如 if、for、while、單獨代碼塊等)形成的獨立作用域,?ES6? 的 let 和 const 聲明的變量僅在當前塊內有效。在代碼塊內部聲明的變量只能在該代碼塊內訪問。
var、let、const的對比:
特性 | var | let | const |
---|---|---|---|
作用域 | 函數作用域(在函數內部使用var聲明)/ 全局作用域(在函數外/沒有被任何函數包圍) | 塊級作用域 | 塊級作用域 |
重復聲明 | 允許在同一個作用域多次聲明一個變量 | 不能(會報錯) | 不能(會報錯) |
變量提升 | 存在(初始為undefined) | 不存在傳統意義上的變量提升 | 不存在傳統意義上的變量提升 |
暫時性死區(TDZ) | 不存在 | 存在? | 存在 |
重新賦值 | √ | √ | 必須初始化且一旦賦值后就不能改變其值 【1】 |
全局對象的屬性【與頂層對象掛鉤】 | 聲明的全局變量會成為window對象的屬性 | 在全局作用域聲明的變量不會成為window的屬性,即window.let聲明的變量打印出來是undefined | 與let同理 |
解釋【1】:但是const如果聲明的是一個對象(數組)那么對象或數組的內容是可以被修改的。這意味著我們可以添加、刪除或更改對象屬性,或者向數組中添加、刪除或修改元素。但是,我們不能將const變量重新指向一個新的對象或數組。const 保證對象的引用不便,而不是值不變。
舉例:
const myobj = {name: 'ssy',age: 18}myobj.name = 'kitty'console.log(myobj);
打印結果:
如果我就是不想讓它改變呢?
可以使用我們的 Object.freeze() Object.freeze()方法,它用于創建一個不可變的對象?。
Object.freeze():
Object.freeze()方法會凍結一個對象,凍結之后不能向這個對象添加新的屬性,不能修改其已有屬性的值,也不能刪除已有屬性。該方法返回被凍結的對象本身?。Object.freeze()凍結的是對象的值,而不是變量的引用
注意:對于嵌套對象,Object.freeze()只會凍結第一層屬性,而不會遞歸凍結。
const myobj = Object.freeze({name: 'ssy',age: 18})myobj.name = 'kitty'console.log(myobj);