區別:
- var和let用以變量聲明常量,const用於聲明只讀常量;
- var聲明的變量,不存在快級作用域,在全局范圍內都有效,let和const聲明的,只在它所在的代碼塊內有效;
- let和const不想var存在變量提升現象,所以var定義的變量可以先使用后聲明,let和const只能先聲明后使用;
- let聲明的變量存在暫時性死區,即只要塊級作用域中存在let,那么它聲明的變量就綁定了這個區域,不再受外部的影響;
- let不允許在相同作用域內聲明同一個變量;
- const在聲明變量時必須初始化賦值,一旦聲明,其聲明的值就不允許改變,更不允許重復聲明,如const聲明了一個復合類型的常量,其存儲的是一個引用地址,不允許改變的是這個地址,而對象本事是可變的;
變量與內存之間的關系,主要由三個部分組成:
- 變量名
- 內存地址
- 內存空間
JS 引擎在讀取變量時,先找到變量綁定的內存地址,然后找到地址所指向的內存空間,最后讀取其中的內容。當變量改變時,JS 引擎不會用新值覆蓋之前舊值的內存空間(雖然從寫代碼的角度來看,確實像是被覆蓋掉了),而是重新分配一個新的內存空間來存儲新值,並將新的內存地址與變量進行綁定,JS 引擎會在合適的時機進行 GC,回收舊的內存空間。const 定義變量(常量)后,變量名與內存地址之間建立了一種不可變的綁定關系,阻隔變量地址被改變,當 const 定義的變量進行重新賦值時,根據前面的論述,JS 引擎會嘗試重新分配新的內存空間,所以會被拒絕,便會拋出異常。