數(shù)據(jù)結(jié)構(gòu)
- 棧:棧是只允許在一端進(jìn)行插入和刪除操作的線性表,是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)答憔。(基本數(shù)據(jù)類型)
采用數(shù)組的pop()和unshift()方法可以模擬棧的先進(jìn)后出。 - 隊(duì)列:隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。(事件循環(huán)隊(duì)列)
采用數(shù)組的pop()和push()方法可以模擬棧的先進(jìn)后出躲庄。 - 堆:堆是基于散列算法的數(shù)據(jù)結(jié)構(gòu)。(引用數(shù)據(jù)類型)
數(shù)據(jù)類型
JS的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型钾虐。
基本數(shù)據(jù)類型(采用按值訪問)
- 定義:基本數(shù)據(jù)是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段噪窘,它是將類型的值直接保存在棧中的某一個(gè)位置。
- 分類:null,undefined倔监,string直砂,boolean,number浩习,symbol
- 基本數(shù)據(jù)類型的值是不變的静暂。
var str = 'hello' str.toUpperCase() console.log(str) // hello //值未發(fā)生改變
- number 類型采用IEEE745雙精度的浮點(diǎn)類型
0.1 + 0.2 !== 0.3 //true
- null不是對(duì)象類型,是基本數(shù)據(jù)類型
這是JS的一個(gè)bug谱秽,在最開始的時(shí)候洽蛀,JS采用32位系統(tǒng),為了性能考慮疟赊,采用低位存儲(chǔ)數(shù)據(jù)的類型郊供,000開頭代表對(duì)象,null全為0近哟,誤判斷為object驮审。typeof null //object
- NaN是基本類型,屬于number
NaN !== NaN // true
- 存儲(chǔ)在棧內(nèi)存中吉执,復(fù)制的是值疯淫,改變其中一個(gè)值對(duì)另一個(gè)沒有影響。
var a = 1; var b = a; b = 2; console.log(a) // 1 console.log(b) // 2 //未改變a的值
- 聲明一個(gè)變量戳玫,但未初始化熙掺,值為undefined
let a; console.log(a) //undefined
- 當(dāng)定義一個(gè)變量用來(lái)表示對(duì)象,建議初始化為null
- false和true時(shí)區(qū)分大小的咕宿。其中
false,0,-0,'',null,undefined,NaN類型轉(zhuǎn)換時(shí)轉(zhuǎn)換為false适掰,其他為true。
- symbol的值是唯一的,并且他不支持new Symbol()
var symbol1 = Symbol() var symbol2 = Symbol() console.log(symbol1 === symbol2) // false
- null和undefined的區(qū)別
- null是一個(gè)表示無(wú)的對(duì)象荠列,轉(zhuǎn)換為數(shù)值為0类浪,undefined表示一個(gè)無(wú)的原始值,轉(zhuǎn)換為數(shù)值表示為NaN.
undefined == null // true (會(huì)進(jìn)行隱式類型轉(zhuǎn)換) undefined === null // false
- null表示此處不應(yīng)該有值肌似,表示一個(gè)對(duì)象被原始的設(shè)置為空值费就;作為函數(shù)的參數(shù),表示該參數(shù)不應(yīng)該是一個(gè)對(duì)象;作為原型鏈的終點(diǎn)川队。
- undefined力细,表示缺少值。變量聲明未賦值為undefined;數(shù)參數(shù)沒有傳實(shí)參為undefined;對(duì)象屬性沒有賦值為undefined;函數(shù)沒有返回值固额,默認(rèn)return undefined;訪問對(duì)象不存在的屬性為undefined;使用void表達(dá)式求值眠蚂,為undefined.
void 0 //undefined void function f(){} //undefined
引用數(shù)據(jù)類型(復(fù)雜數(shù)據(jù)類型,采用引用訪問斗躏。)
- 定義:引用類型是在棧內(nèi)存中保存指向堆內(nèi)存中的地址指針逝慧,在堆內(nèi)存中保存具體內(nèi)容的數(shù)據(jù)類型。
- 分類:引用類型統(tǒng)稱為Object對(duì)象,具體可分為Object笛臣,Array云稚,Date,RegExp,Function等
- 直接賦值引用類型的值是可變的。
引用類型采用棧內(nèi)存存儲(chǔ)指向地址指針沈堡,當(dāng)var obj1 = obj的時(shí)候静陈,其實(shí)賦值的是地址指針,當(dāng)obj1.a=2的時(shí)候诞丽,改變的是地址指針指向的堆內(nèi)存的內(nèi)容鲸拥,因?yàn)閛bj1和obj2的地址指針指向同一堆塊內(nèi)存地址,所以改變一個(gè)僧免,堆內(nèi)存的內(nèi)容也都改變了崩泡。var obj = { a: 1 } var obj1 = obj; obj1.a = 2 console.log(obj.a) // 2 console.log(obj1.a) // 2
- 堆內(nèi)存進(jìn)行比較是引用比較,比較地址是否一致
var obj1 = {a: 1} var obj2 = {a:1} console.log(obj1 === obj2) // false // 每創(chuàng)建一個(gè)對(duì)象其實(shí)都會(huì)創(chuàng)建一個(gè)新的內(nèi)存猬膨,就算內(nèi)容完全一致,地址指針也是不一樣的呛伴。
- 引用類型的值是保存在堆內(nèi)存中的對(duì)象勃痴。
- 引用類型直接賦值,會(huì)互相影響热康,所以采用深拷貝和淺拷貝沛申,(拷貝具體的內(nèi)容,而不是像賦值一樣姐军,只賦值地址指針)在對(duì)新對(duì)象進(jìn)行操作的時(shí)候铁材,便不會(huì)影響原來(lái)的對(duì)象。
深拷貝及淺拷貝