數(shù)據(jù)結(jié)構(gòu)
- 棧:棧是只允許在一端進行插入和刪除操作的線性表,是一種先進后出的數(shù)據(jù)結(jié)構(gòu)。(基本數(shù)據(jù)類型)
采用數(shù)組的pop()和unshift()方法可以模擬棧的先進后出。 - 隊列:隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu)。(事件循環(huán)隊列)
采用數(shù)組的pop()和push()方法可以模擬棧的先進后出。 - 堆:堆是基于散列算法的數(shù)據(jù)結(jié)構(gòu)。(引用數(shù)據(jù)類型)
數(shù)據(jù)類型
JS的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。
基本數(shù)據(jù)類型(采用按值訪問)
- 定義:基本數(shù)據(jù)是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,它是將類型的值直接保存在棧中的某一個位置。
- 分類:null,undefined,string,boolean,number,symbol
- 基本數(shù)據(jù)類型的值是不變的。
var str = 'hello' str.toUpperCase() console.log(str) // hello //值未發(fā)生改變 - number 類型采用IEEE745雙精度的浮點類型
0.1 + 0.2 !== 0.3 //true - null不是對象類型,是基本數(shù)據(jù)類型
這是JS的一個bug,在最開始的時候,JS采用32位系統(tǒng),為了性能考慮,采用低位存儲數(shù)據(jù)的類型,000開頭代表對象,null全為0,誤判斷為object。typeof null //object - NaN是基本類型,屬于number
NaN !== NaN // true - 存儲在棧內(nèi)存中,復制的是值,改變其中一個值對另一個沒有影響。
var a = 1; var b = a; b = 2; console.log(a) // 1 console.log(b) // 2 //未改變a的值 - 聲明一個變量,但未初始化,值為undefined
let a; console.log(a) //undefined - 當定義一個變量用來表示對象,建議初始化為null
- false和true時區(qū)分大小的。其中
false,0,-0,'',null,undefined,NaN類型轉(zhuǎn)換時轉(zhuǎn)換為false,其他為true。 - symbol的值是唯一的,并且他不支持new Symbol()
var symbol1 = Symbol() var symbol2 = Symbol() console.log(symbol1 === symbol2) // false - null和undefined的區(qū)別
- null是一個表示無的對象,轉(zhuǎn)換為數(shù)值為0,undefined表示一個無的原始值,轉(zhuǎn)換為數(shù)值表示為NaN.
undefined == null // true (會進行隱式類型轉(zhuǎn)換) undefined === null // false- null表示此處不應該有值,表示一個對象被原始的設置為空值;作為函數(shù)的參數(shù),表示該參數(shù)不應該是一個對象;作為原型鏈的終點。
- undefined,表示缺少值。變量聲明未賦值為undefined;數(shù)參數(shù)沒有傳實參為undefined;對象屬性沒有賦值為undefined;函數(shù)沒有返回值,默認return undefined;訪問對象不存在的屬性為undefined;使用void表達式求值,為undefined.
void 0 //undefined void function f(){} //undefined
引用數(shù)據(jù)類型(復雜數(shù)據(jù)類型,采用引用訪問。)
- 定義:引用類型是在棧內(nèi)存中保存指向堆內(nèi)存中的地址指針,在堆內(nèi)存中保存具體內(nèi)容的數(shù)據(jù)類型。
- 分類:引用類型統(tǒng)稱為Object對象,具體可分為Object,Array,Date,RegExp,Function等
- 直接賦值引用類型的值是可變的。
引用類型采用棧內(nèi)存存儲指向地址指針,當var obj1 = obj的時候,其實賦值的是地址指針,當obj1.a=2的時候,改變的是地址指針指向的堆內(nèi)存的內(nèi)容,因為obj1和obj2的地址指針指向同一堆塊內(nèi)存地址,所以改變一個,堆內(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)存進行比較是引用比較,比較地址是否一致
var obj1 = {a: 1} var obj2 = {a:1} console.log(obj1 === obj2) // false // 每創(chuàng)建一個對象其實都會創(chuàng)建一個新的內(nèi)存,就算內(nèi)容完全一致,地址指針也是不一樣的。 - 引用類型的值是保存在堆內(nèi)存中的對象。
- 引用類型直接賦值,會互相影響,所以采用深拷貝和淺拷貝,(拷貝具體的內(nèi)容,而不是像賦值一樣,只賦值地址指針)在對新對象進行操作的時候,便不會影響原來的對象。
深拷貝及淺拷貝