1. 程式人生 > 實用技巧 >js資料型別型別

js資料型別型別

一,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)) //boolean
console.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 instanceof
Array) console.log(arr instanceof Object)

特殊的number:NaN----非數值

  1. NaN和任何資料計算都返回NaN
  2. NaN不等於NaN
  3. isNaN()會將接受的引數嘗試轉換為數值再做判斷是否為NaN

2,基本資料型別和引用資料型別的區別

首先,解釋一下棧和堆的區別,棧(stack)為自動分配的空間,大小固定,它由系統自動釋放;堆(heap)則是動態分配的記憶體,大小也不一定自動釋放;

1.變數儲存記憶體位置不同:

  • 基本資料型別:大小固定,存放在棧中
  • 引用資料型別:大小不固定,如果存放在棧中會影響變數操作的速度,故存放在堆中,棧中儲存的變數是引用查詢堆中引用地址(指標),地址大小是固定的,所以儲存在棧中對於變數操作的效能無任何影響

2.訪問變數的機制不同:

  • 基本資料型別:直接訪問
  • 引用資料型別:js不允許直接操作存放在堆中的物件,操作引用型別的物件,實際上是操作該引用型別存放在棧中的地址。(這種說法是不嚴密的,複製該物件的時候,操作的是物件的引用,為該物件新增屬性時操作的是實際的物件)

3.複製變數時不同:

  • 基本資料型別:將該變數的值賦值給新的變數,兩個變數完全獨立
  • 引用資料型別:只是將該變數棧中物件的地址賦值給新的變數,這兩個變數都指向堆中相同的引用物件。

4.引數傳遞不同:

  • 基本資料型別:被傳遞的變數會被複制給函式的區域性變數,二者相互獨立
  • 引用資料型別:被傳遞的變數的地址複製給函式的區域性變數,二者相互影響。