主要內(nèi)容:
- 數(shù)據(jù)類型
- 數(shù)據(jù)類型轉(zhuǎn)換
- 檢測數(shù)據(jù)類型的方法
六種數(shù)據(jù)類型
五種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number、String,其中 Undefined 和 Null 是特殊值。
- 數(shù)值(Number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(String):文本(比如Hello World)
- 布爾值(Boolean):表示真?zhèn)蔚膬蓚€(gè)特殊值,即true(真)和false(假)
- Undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時(shí)沒有任何值
- Null:表示空值,即此處的值為空
一種復(fù)雜數(shù)據(jù)類型:Object
- 對象(Object):本質(zhì)上是由一組無序的名值對組成的。
- 可以分為:狹義的對象(object)、數(shù)組(array)、函數(shù)(function)
數(shù)據(jù)類型轉(zhuǎn)換
確定數(shù)值類型的三種方法
JavaScript 有三種方法,可以確定一個(gè)值到底是什么類型。
typeof檢測值的基本數(shù)據(jù)類型
instanceof驗(yàn)證一個(gè)對象是否為指定的構(gòu)造函數(shù)的實(shí)例
Object.prototype.toString 判斷對象的具體類型
typeof 運(yùn)算符
作用:用來檢測給定變量的數(shù)值類型
函數(shù)返回function。undefined 返回 undefined。null返回object。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
function f() {}
typeof f
// "function"
typeof undefined
// "undefined"
typeof null // "object"
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
注意:對未初始化的變量使用 typeof 操作符返回 undefined,對未聲明的變量使用 typeof 操作符也返回 undefined。這樣的話,typeof 可以用來檢查一個(gè)沒有聲明的變量,而不報(bào)錯(cuò)。
//通常用在判斷語句
if (typeof v === "undefined") {
// ...
}
//未初始化和未聲明
var a;
typeof a
//"undefined"
typeof b
//"undefined"
instanceof 運(yùn)算符
作用:判斷左邊的值是否是右邊的值的實(shí)例對象
- instanceof 運(yùn)算符返回一個(gè)布爾值,表示對象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。比如,instanceof 運(yùn)算符可以區(qū)分?jǐn)?shù)組和對象。
- instanceof 運(yùn)算符的左邊是實(shí)例對象,右邊是構(gòu)造函數(shù)。它會(huì)檢查右邊構(gòu)建函數(shù)的原型對象(prototype),是否在左邊對象的原型鏈上。就是左邊對象是否是右邊對象的實(shí)例。有一種特殊情況,就是左邊對象的原型鏈上,只有null對象。這時(shí),instanceof 判斷會(huì)失真。
- 由于 instanceof 檢查整個(gè)原型鏈,因此同一個(gè)實(shí)例對象,可能會(huì)對多個(gè)構(gòu)造函數(shù)都返回true。
var myString = new String();
var myDate = new Date();
myString instanceof String;
// true
myString instanceof Object;
// true
myString instanceof Date;
// false
- instanceof 運(yùn)算符只能用于對象,不適用原始類型的值。下面代碼中 s 是字符串,字符串不是 String 對象的實(shí)例(字符串不是對象),所以返回 false。
var s = 'hello';
s instanceof String
// false
- 對于undefined 和 null,instanceof 運(yùn)算符總是返回 false。
undefined instanceof Object
// false
null instanceof Object
// false
- 由于任意對象(除了 null)都是Object的實(shí)例,所以 instanceof 運(yùn)算符可以判斷一個(gè)值是否為非 null 的對象。
var obj = {};
obj instanceof Object
// true
null instanceof Object
// false
Object.prototype.toString方法
作用:判斷數(shù)據(jù)類型
toString 方法
- toString 方法的作用是返回一個(gè)對象的字符串形式,默認(rèn)情況下返回類型字符串。
var obj = {}
obj.toString();
// "[object Object]"
通過自定義 toString 方法,可以讓對象在自動(dòng)類型轉(zhuǎn)換時(shí),得到想要的字符串形式。
var obj = new Object();
obj.toString = function () {
return 'hello';
};
obj + ' ' + 'world'
// "hello world"
上面代碼表示,當(dāng)對象用于字符串加法時(shí),會(huì)自動(dòng)調(diào)用 toString 方法。由于自定義了 toString 方法,所以返回字符串 hello world。
- 數(shù)組、字符串、函數(shù)、Date 對象都分別部署了自定義的 toString 方法,覆蓋了 Object.prototype.toString 方法,所以并不會(huì)返回 [object Object]。
[1, 2, 3].toString()
// "1,2,3"
'123'.toString()
// "123"
(function () {
return 123;
}).toString()
// "function () {
// return 123;
// }"
(new Date()).toString()
// "Tue May 10 2016 09:11:31 GMT+0800 (CST)"
toString 方法用于判斷值類型
- Object.prototype.toString 方法返回對象的類型字符串,因此可以用來判斷一個(gè)值的類型。
var obj = {};
obj.toString() // "[object Object]"
上面代碼調(diào)用空對象的 toString 方法,結(jié)果返回一個(gè)字符串 object Object,其中第二個(gè) Object 表示該值的構(gòu)造函數(shù)。
- 由于實(shí)例對象可能會(huì)自定義 toString 方法,覆蓋掉原型對象的 Object.prototype.toString 方法,所以為了得到類型字符串,最好直接使用 Object.prototype.toString 方法。通過函數(shù)的 call 方法,可以在任意值上調(diào)用這個(gè)方法,來判斷這個(gè)值的類型,如下:對 value 這個(gè)值調(diào)用該方法。
Object.prototype.toString.call(value)
不同數(shù)據(jù)類型的 Object.prototype.toString 方法返回值:
- 數(shù)值:返回[object Number]。
- 字符串:返回[object String]。
- 布爾值:返回[object Boolean]。
- undefined:返回[object Undefined]。
- null:返回[object Null]。
- 數(shù)組:返回[object Array]。
- arguments 對象:返回[object Arguments]。
- 函數(shù):返回[object Function]。
- Error 對象:返回[object Error]。
- Date 對象:返回[object Date]。
- RegExp 對象:返回[object RegExp]。
- 其他對象:返回[object Object]。
Object.prototype.toString.call(2)
// "[object Number]"
Object.prototype.toString.call('')
// "[object String]"
Object.prototype.toString.call(true)
// "[object Boolean]"
Object.prototype.toString.call(undefined)
// "[object Undefined]"
Object.prototype.toString.call(null)
// "[object Null]"
Object.prototype.toString.call(Math)
// "[object Math]"
Object.prototype.toString.call({})
// "[object Object]"
Object.prototype.toString.call([])
// "[object Array]"
Object.prototype.toString.call(/abcd/);
// "[object RegExp]"