JavaScript 基礎(chǔ)知識之?dāng)?shù)據(jù)類型

主要內(nèi)容:

  • 數(shù)據(jù)類型
  • 數(shù)據(jù)類型轉(zhuǎn)換
  • 檢測數(shù)據(jù)類型的方法

六種數(shù)據(jù)類型

五種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、NullBoolean、NumberString,其中 UndefinedNull 是特殊值。

  • 數(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]"

更多具體應(yīng)用請看這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容