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數據類型的理解,如果有不對的地方,請大家及時指出!!!