JS的數據類型(深入理解undefined與null)

 

JS的數據類型

總體來說,JS的數據類型可以分爲兩大類

基本數據類型:

string: 任意字符串

number: 任意數字(整數、小數)

boolean: false/ true

undefined: undefined

null: null 

引入數據類型

object: 任意對象

Array: 一種特別的對象(數值下標屬性,內部數據是有序的)

Function:一種特別的對象(可以執行)

 以上就是JS的全部的基本數據類型,但是怎麼判斷一個值是什麼數據類型呢??? 接下來將會詳細講解

首先,可以通過typeof、instanceof、=== 來進行判斷,但是,他們之間有什麼區別呢? 每一種數據類型需要怎麼判斷呢?

在判斷數據類型的時候,你需要知道,typeof 返回的是數據類型的字符串表達,而instanceof返回的是一個boolean值,用於判斷對象的具體類型

首先,先對基本數據類型進行判斷。

undefined

      var a
      console.log(a, typeof a, typeof a === 'undefined', a === undefined) //undefined 'undefined'  true true
      console.log(undefined === 'undefined') // false

這裏注意,我們聲明一個a,但是沒有給他賦值,他的默認值爲undefined。typeof a  返回的是'undefined',注意:這裏是數據類型的字符串表達。 因爲undefined的值只有一個,所以可以使用===進行直接比較。

string、number、boolean

      a = 3
      console.log(typeof a === 'number') // true

      a = 'hello'
      console.log(typeof a === 'string') // true

      a = true
      console.log(typeof a === 'boolean') // true

通過以上代碼發現,string、number、boolean數據類型,只能通過typeof 進行判斷

null

      a = null
      console.log(typeof a, a === null) //object true

在基本數據類型中,undefined和null很特殊,因爲他們的值只有一個。但是typeof 判斷null的類型,會返回object(後序會講解爲什麼),通過===是可以判斷null的數據類型的。

對象類型的判斷

首先,先創建一個這樣的對象

var b = {
        b1: [1, 'abc', console.log],
        b2: function() {
          console.log('b3')
          return function () {
            return 'hello word'
            }
        }
      }

這裏大家可以思考一下,console.log是一個什麼類型的數據(可以將自己的想法評論在下方)

 console.log(b instanceof Object, b instanceof Array) // true false

通過instanceof可以判斷b是對象類型,這裏的Object和Array都是構造函數

console.log(b.b1 instanceof Array, b.b1 instanceof Object) // true true
console.log(typeof b.b1) // object

b.b1是一個數組,可以看出數組也屬於Object類型,數組是一種特殊的對象。但是不能通過typeof 來判斷是否爲數組

      console.log(b.b2 instanceof Function, b.b2 instanceof Object) // true true
      console.log( typeof b.b2 ==='function') // true

b.b2  是一個函數,可以通過typeof來進行判斷

總結:經過以上代碼研究,可以發現,typeof可以判斷的數據類型有:string、number、boolean、function、undefined,但是不能判斷null與object 、 Array和object。===可以判斷undefined和null ,因爲他們都只有一種值。

 


基本數據類型中,undefined和null 都表示一個空值,那麼他們有什麼區別呢?????

var data;
console.log(data === undefined); //true

 當我們聲明瞭一個變量,沒有對其進行初始化時,他的值爲undefined

那麼我們是否可以將一個值初始爲undefined呢? 

var data = undefined;
console.log(data === undefined); //true

顯然是可以的! 一般而言,我們不存在需要顯式地把一個變量設置爲undefined值的情況,因爲對於未經初始化的值默認就會取得undefined值,而已經初始化的值再將其賦值爲undefined來表示空值是沒有意義且不可取的。

 

window.undefined

從上面的例子我們可以看出,無論我們是否初始化過變量,都可以把變量賦值爲undefined。

其實這裏用於賦值的undefined不是一個值,它是一個屬性名,undefined是全局對象的一個屬性,也就是說,它是全局作用域的一個變量,即window.undefined,而window.undefined這個屬性的值纔是前面所說的原始值undefined。

data = undefined;這就相當於把一個變量window.undefined的值賦值給另一個變量data,這個值就是原始值undefined。

console.log(window.undefined); //原始值undefined

undefined的判斷

如何判斷一個變量是否爲undefined呢? 這裏有兩種方法

1. 就是前面所說的使用嚴格相等符 === 

2. 使用typeof,嚴格來說,需要以下方式

var data;
console.log(data === void 0); //true

 因爲void運算符,會對給定的表達式求值,然後返回undefined,因此我們可以使用void 0,來代替undefined來進行判斷。

(function() {
    var undefined = 'not is undefined';
    console.log(undefined); //"not is undefined"
    console.log(typeof undefined) // "string"
})()

undefined的值是可以改變的,所以直接使用undefined會不安全。

Null類型

Null類型是第二個只有一個值的數據類型,這個特殊的值就是null。值 null 是一個字面量,它不像undefined 是全局對象的一個屬性。

但是爲什麼typeof null 的返回類型確實object呢? 原因有兩個:

            一方面從邏輯角度來看,null值表示一個空對象指針,它代表的其實就是一個空對象,所以使用typeof操作符檢測時返回”object”也是可以理解的。

           另一方面,其實在JavaScript 最初的實現中,JavaScript 中的值是由一個表示類型的標籤和實際數據值表示的。對象的類型標籤是 0。由於 null 代表的是空指針(大多數平臺下值爲 0x00),因此,null的類型標籤也成爲了 0,typeof null就錯誤的返回了”object”。在ES6中,當時曾經有提案爲歷史平凡, 將type null的值糾正爲null, 但最後提案被拒了,所以還是保持”object”類型。

null使用

一般會在兩個地方使用:

初始賦值爲null,表示該聲明的變量將要賦值爲對象

結束前爲null,表示將該對象變成垃圾對象,被垃圾回收器回收。

 

以上就是我對JS數據類型的理解,如果有不對的地方,請大家及時指出!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章