js資料型別型別
阿新 • • 發佈:2020-11-19
一,JS資料型別
基本資料型別:String, Number ,Boolean,undefined,null,symbol。(5種)
引用資料型別:Object
1,檢測資料型別
typeof(操作符),可以檢測String ,Number ,Boolean,undefined,symbol
var s = 'abc' var n = 123 var b = true var u var sy= Symbol('1') console.log(typeof(s)) //string console.log(typeof(n)) //number console.log(typeof(b)) //booleanconsole.log(typeof(u)) //undefined console.log(typeof(sy)) // symbol
但是無法在檢測null和引用資料型別時用處不大
var nu = null var obj = new Object() console.log(typeof(nu)) // object console.log(typeof(obj)) // object
所以ECMAScript,提供了 instanceof 操作符,用來檢測引用資料型別
var arr = [1,2,3] var obj = new Object() console.log(arr instanceofArray) console.log(arr instanceof Object)
特殊的number:NaN----非數值
- NaN和任何資料計算都返回NaN
- NaN不等於NaN
- isNaN()會將接受的引數嘗試轉換為數值再做判斷是否為NaN
2,基本資料型別和引用資料型別的區別
首先,解釋一下棧和堆的區別,棧(stack)為自動分配的空間,大小固定,它由系統自動釋放;堆(heap)則是動態分配的記憶體,大小也不一定自動釋放;
1.變數儲存記憶體位置不同:
- 基本資料型別:大小固定,存放在棧中
- 引用資料型別:大小不固定,如果存放在棧中會影響變數操作的速度,故存放在堆中,棧中儲存的變數是引用查詢堆中引用地址(指標),地址大小是固定的,所以儲存在棧中對於變數操作的效能無任何影響
2.訪問變數的機制不同:
- 基本資料型別:直接訪問
- 引用資料型別:js不允許直接操作存放在堆中的物件,操作引用型別的物件,實際上是操作該引用型別存放在棧中的地址。(這種說法是不嚴密的,複製該物件的時候,操作的是物件的引用,為該物件新增屬性時操作的是實際的物件)
3.複製變數時不同:
- 基本資料型別:將該變數的值賦值給新的變數,兩個變數完全獨立
- 引用資料型別:只是將該變數棧中物件的地址賦值給新的變數,這兩個變數都指向堆中相同的引用物件。
4.引數傳遞不同:
- 基本資料型別:被傳遞的變數會被複制給函式的區域性變數,二者相互獨立
- 引用資料型別:被傳遞的變數的地址複製給函式的區域性變數,二者相互影響。