本題地址:https://github.com/YvetteLau/Step-By-Step/issues/5
JS中基本數(shù)據(jù)類型
-
原始數(shù)據(jù)類型 (不是對象且沒有方法)
Boolean搭盾、Null咳秉、Undefined、Number鸯隅、String澜建、Symbol(ES6 新增)、BigInt(ES10)
- Boolean 類型
表示一個邏輯實體蝌以,有兩個值:true 和 false炕舵。 - Null 類型
表示缺少的標(biāo)識,指示變量未指向任何對象跟畅。 - Undefined 類型
一個沒有被賦值的變量會有個默認(rèn)值 undefined咽筋。 - Number 類型
根據(jù) ECMAScript 標(biāo)準(zhǔn),Number 基于 IEEE 754 標(biāo)準(zhǔn)的雙精度 64 位二進(jìn)制格式的值(-(263 -1) 到 263 -1)徊件。它并沒有為整數(shù)給出一種特定的類型奸攻。除了能夠表示浮點(diǎn)數(shù)外,還有一些帶符號的值:+Infinity虱痕,-Infinity 和 NaN (非數(shù)值睹耐,Not-a-Number)。 - String 類型
用于表示文本數(shù)據(jù)部翘。它是一組16位的無符號整數(shù)值的“元素”疏橄。 - Symbol 類型
表示獨(dú)一無二的值。 - BigInt 類型
BigInt 是 JavaScript 中的一個新的原始數(shù)值類型略就,它可以以任意精度表示整數(shù)捎迫。使用 BigInt 可以安全地存儲和操作大型整數(shù),甚至超過數(shù)字的安全整數(shù)限制表牢。一個 BigInt 數(shù)據(jù)可以通過將 n 附加到 Integer 的末尾或通過調(diào)用構(gòu)造函數(shù)創(chuàng)建窄绒。
- Boolean 類型
復(fù)雜數(shù)據(jù)類型
Object
(emmm 這個內(nèi)容太多了)
null 是對象嗎?
不是崔兴。null 值表示缺少的標(biāo)識彰导,指示變量未指向任何對象蛔翅。
The value null is written with a literal: null. null is not an identifier for a property of the global object, like undefined can be. Instead, null expresses a lack of identification, indicating that a variable points to no object.
---------- 下面是劉小夕的答案 -----------
null 不是一個對象,盡管 typeof null 輸出的是 Object位谋,這是一個歷史遺留問題山析,JS 的最初版本中使用的是 32 位系統(tǒng),為了性能考慮使用低位存儲變量的類型信息掏父,000 開頭代表是對象笋轨,null 表示為全零,所以將它錯誤的判斷為 Object 赊淑。
基本數(shù)據(jù)和復(fù)雜數(shù)據(jù)類型有什么區(qū)別爵政?
- 基本數(shù)據(jù)類型: 存放在棧內(nèi)存中,它們是按值存放的
- 引用數(shù)據(jù)類型: 存放在堆內(nèi)存當(dāng)中陶缺,它們是按引用地址存放的
在變量賦值或函數(shù)傳參時钾挟,數(shù)據(jù)傳遞的方式會有不同,基本類型是復(fù)制一份值進(jìn)行傳遞饱岸,引用類型則是傳遞了內(nèi)存地址掺出。
---------- 下面是劉小夕的答案 -----------
- 內(nèi)存的分配不同
基本數(shù)據(jù)類型存儲在棧中。
復(fù)雜數(shù)據(jù)類型存儲在堆中苫费,棧中存儲的變量汤锨,是指向堆中的引用地址。
- 訪問機(jī)制不同
基本數(shù)據(jù)類型是按值訪問黍衙。
復(fù)雜數(shù)據(jù)類型按引用訪問,JS不允許直接訪問保存在堆內(nèi)存中的對象荠诬,在訪問一個對象時琅翻,首先得到的是這個對象在堆內(nèi)存中的地址,然后再按照這個地址去獲得這個對象中的值柑贞。
- 復(fù)制變量時不同
基本數(shù)據(jù)類型:a=b;是將b中保存的原始值的副本賦值給新變量a方椎,a和b完全獨(dú)立,互不影響钧嘶。
復(fù)雜數(shù)據(jù)類型:a=b;將b保存的對象內(nèi)存的引用地址賦值給了新變量a;a和b指向了同一個堆內(nèi)存地址棠众,其中一個值發(fā)生了改變,另一個也會改變有决。
let b = {
age: 10
}
let a = b;
a.age = 20;
console.log(a); // { age: 20 }
- 參數(shù)傳遞的不同(實參/形參)
函數(shù)傳參都是按值傳遞(棧中的存儲的內(nèi)容):基本數(shù)據(jù)類型闸拿,拷貝的是值;復(fù)雜數(shù)據(jù)類型书幕,拷貝的是引用地址新荤。
// 基本數(shù)據(jù)類型
let b = 10
function change(info) {
info=20;
}
// info=b; 基本數(shù)據(jù)類型,拷貝的是值得副本台汇,二者互不干擾
change(b);
console.log(b); // 10
// 復(fù)雜數(shù)據(jù)類型
let b = {
age: 10
}
function change(info) {
info.age = 20;
}
// info=b; 根據(jù)第三條差異苛骨,可以看出篱瞎,拷貝的是地址的引用,修改互相影響痒芝。
change(b);
console.log(b); // { age: 20 }