總結
- 宣告變數時不同的記憶體地址分配:
- 簡單型別的值存放在棧中,在棧中存放的是對應的值
- 引用型別對應的值儲存在堆中,在棧中存放的是指向堆記憶體的地址
- 不同的型別資料導致賦值變數時的不同:
- 簡單型別賦值,是生成相同的值,兩個物件對應不同的地址
- 複雜型別賦值,是將儲存物件的記憶體地址賦值給另一個變數。也就是兩個變數指向堆記憶體中同。一個物件
基本型別
-
Number
數值最常見的整數型別格式則為十進位制,還可以設定八進位制(零開頭)、十六進位制(0x開頭)let num_1 = 11 // 10 進位制 let num_2 = 030 // 8 進位制 let num_3 = 0xC // 16 進位制
浮點型別則在數值彙總必須包含小數點,還可透過科學計數法表示
// 浮點 num_1 = 1.1 num_2 = .1 // 不推薦使用這種方式定義--可讀性差,風格不一致,程式碼規範,容易出錯 num_3 = 1.3e4 // 科學記數法
在數值型別中,存在一個特殊數值
NaN
,意為不是數值
,用於表示本來要返回數值的操作失敗了(而不是丟擲錯誤) -
String
字串可以使用雙引號""
、單引號''
或反引號 `` 表示let str = 'abc' let stri = "ef" let strin = `ghi` console.log([str, stri, strin])
字串是不可變的,意思是一旦建立,它們的值就不能變了
let lang = 'Java' lang = lang + 'Script' // 先銷燬在建立 console.log(lang)
任何看似修改字串的操作實際上都會建立並返回一個新的字串
-
Boolean
Boolean
(布林值)型別有兩個字面值:true
和false
透過Boolean
可以將其他型別的資料轉化成布林值資料型別 轉換為 true 的值 轉換為 false 的值 String 非空字串 空字串 Number 非零數值(包括無窮值) 0, NaN Object 任意物件 N/A(不存在) Undefined N/A(不存在) undefined -
Undefined
Undefined
型別只有一個值,就是特殊值undefined
,當我們宣告變數但沒有初始化時,變數會有一個預設的undefined
值let und console.log(und)
當我們試圖越界訪問不存在的值時,也會得到
undefined
let list = [] console.log(list[0])
-
null
Null
型別同樣只有一個值,即特殊值null
邏輯上講,null
值表示一個空物件指標,這也是給typeof
傳一個null
會返回object
的原因const Null = null console.log(typeof Null)
undefined
值是由null
值派生而來
只要變數要儲存物件,而當時又沒有那個物件可儲存,就可用null
來填充該變數 -
symbol
Symbol
(符號)是原始值,且符號例項是唯一、不可變的。符號的用途是確保物件屬性使用唯一識別符號,不會發生屬性衝突的危險let genericSymbol=Symbol(); let otherGenericSymbol=Symbol(); console.log(genericSymbol === otherGenericSymbol);// false let fooSymbol=Symbol('foo'); let otherFooSymbol=Symbol('foo'); console.log(fooSymbol === otherFooSymbol);//false
let a= 10;
let b = a;// 賦值操作
b = 20;
console.log(a);//10值
a
的值為一個基本型別,是儲存在棧中,將a
的值賦給b
,雖然兩個變數的值相等,但是兩個變數儲存了兩個不同的記憶體地址
引用型別
- Object
- Array
- Function
- Date
- RegExp
- Map
- ......
const obj1 = {}
const obj2 = obj1
obj2.lang = "javaScript"
console.log(obj1)
引用型別資料存放在堆中,每個堆記憶體物件都有對應的引用地址指向它,引用地址存放在棧中。
obj1
是一個引用型別,在賦值操作過程彙總,實際是將堆記憶體物件在棧記憶體的引用地址複製了一份給了 obj2
,實際上他們共同指向了同一個堆記憶體物件,所以更改 obj2
會對 obj1
產生影響