Let:用來聲明變數,但是所聲明的變數,只在let命令所在的代碼塊內生效。 變數提升:變數可以在聲明之前使用,值為undefined。 暫時性死區:在代碼塊內,使用let命令聲明變數之前,該變數都是不可用的。 不允許重覆聲明:let不允許在相同作用域內,重覆聲明同一變數。 Const:const聲明 ...
Let:用來聲明變數,但是所聲明的變數,只在let命令所在的代碼塊內生效。
變數提升:變數可以在聲明之前使用,值為undefined。
暫時性死區:在代碼塊內,使用let命令聲明變數之前,該變數都是不可用的。
不允許重覆聲明:let不允許在相同作用域內,重覆聲明同一變數。
Const:const聲明一個只讀的常量。一旦聲明,常量的值就不能改變,一旦聲明變數,就必須立刻初始化,不能留到以後賦值。
Const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址所保存的數據不得改動。對於簡單類型的數據(數值、字元串、布爾值),值就保存在變數指向的那個記憶體地址,因此等同於常量。但對於複合類型的數據(主要是對象和數組),變數指向的記憶體地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的(即總是指向另一個固定的地址),至於它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。
基本數據類型:number、string、boolean、undefined、null、symbol、BigInt,七類。
引用數據類型:Object(在JS中除了基本數據類型以外的都是對象,數據是對象,函數是對象,正則表達式是對象。)
棧(stack):自動分配的記憶體空間,它由系統自動釋放。
堆(heap):動態分配的記憶體,大小也不一定會自動釋放。
基本數據類型(存放在棧中):基本數據類型是指存放在棧中的簡單數據段,數據大小確定,記憶體空間大小可以分配,他們是直接按值存放的,所以可以直接按值訪問。
引用數據類型(存放在堆記憶體中的對象,每個空間大小不一樣,要根據情況進行特定的配置)
引用類型是存放在堆記憶體中的對象,變數其實是保存的再棧記憶體中的一個指針(保存的是記憶體中的引用地址),這個指針指向堆記憶體。引用類型數據在棧記憶體中保存的實際上是對象在堆記憶體中的引用地址。通過這個引用地址可以快速查找到保存在堆記憶體中的對象。
基本數據類型和引用數據類型的區別
1:聲明變數時記憶體分配不同
原始類型:在棧中,因為占據空間是固定的,可以將他們存在較小的記憶體中-棧中,這樣便於迅速查詢變數的值。
引用類型:存在堆中,棧中存儲的變數,只是用來查找堆中的引用地址。
這是因為:引用值得大小會改變,所以不能把它放在棧中,否則會降低變數查詢的速度。相反,放在變數的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中堆變數性能無任何負面影響。
2:不同的記憶體分配帶來不同的訪問機制
在js中是不允許直接訪問保存在堆記憶體中的對象的,所以在訪問一個對象時,首先得到的是這個對象在堆記憶體中的地址,然後再按照這個地址去獲得這個對象中的值,這就是按引用訪問。而原始類型的值是可以直接訪問到的。
3:複製變數時的不同
原始值:在將一個保存著原始值的變數複製給另一個變數時,會將原始值得副本賦值給新變數,此後這兩個變數是完全獨立的,他們只是擁有相同的value而已。
引用值:在將一個保存著對象記憶體地址的變數複製給另一個變數時,會把這個記憶體地址賦值給新變數,也就是說這兩個變數都指向了堆記憶體中的同一個對象,他們中任何一個作出的改變都會反映在另一個身上。多了一個指針而已。
4:參數傳遞的不同(把實參複製給形參的過程)
Es中所有函數的參數都是按值來傳遞的,
原始值:只是把變數里的值傳遞給參數,之後參數和這個變數互不影響。
引用值:對象變數它裡面的值是這個對象在堆記憶體中的記憶體地址!因此它傳遞的值也就是這個記憶體地址,這也就是函數內部對這個參數進行修改會提現在外部的原因,因為他們都指向同一個對象。
參考網址:https://www.cnblogs.com/c2016c/articles/9328725.html