JavaScript之?dāng)?shù)據(jù)類型及判斷

一.數(shù)據(jù)類型

JavaScript的數(shù)據(jù)類型可分為兩大類:基本數(shù)據(jù)類型引用數(shù)據(jù)類型二拐。

1.基本數(shù)據(jù)類型

基本數(shù)據(jù)類型有6種:數(shù)字(Number)、字符串(String)诅病、布爾值(Boolean)哪亿、Undefined粥烁、Null、Symbol(ES6新增)蝇棉。

基礎(chǔ)數(shù)據(jù)類型有以下特點:

  • 基本數(shù)據(jù)類型的值是不可變的讨阻,且不可以添加屬性和方法。
  • 基本數(shù)據(jù)類型的比較是本身值的比較
  • 基本數(shù)據(jù)類型是存儲在棧的

2.引用數(shù)據(jù)類型

引用數(shù)據(jù)類型主要有以下幾種:對象(Object)篡殷、數(shù)組(Array)钝吮、函數(shù)(Function)、還有兩個特殊的對象:正則(RegExp)和日期(Date)板辽。

引用數(shù)據(jù)類型有以下特點:

  • 引用數(shù)據(jù)類型的值是可變的奇瘦,且可以添加屬性和方法
  • 引用數(shù)據(jù)類型的比較是引用對象的比較
  • 引用數(shù)據(jù)類型的值是保存在堆內(nèi)存的一個對象,棧內(nèi)存保存的是指向這個對象的指針(或者說堆內(nèi)存的地址)

二.類型判斷

1.typeof

typeof返回一個表示數(shù)據(jù)類型的字符串劲弦,返回結(jié)果包括:number耳标、string、boolean邑跪、object次坡、undefined、function画畅。typeof可以對基本類型number砸琅、string 、boolean轴踱、undefined做出準(zhǔn)確的判斷(null除外症脂,typeof null===“object”,這是由于歷史遺留bug)淫僻;而對于引用類型诱篷,除了function之外返回的都是object。但當(dāng)我們需要知道某個對象的具體類型時嘁傀,typeof就顯得有些力不從心了

typeof 1; // number 有效
typeof ‘ ’;//string 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof null; //object 無效
typeof new Function(); // function 有效
typeof [] ; //object 無效
typeof new Date(); //object 無效
typeof new RegExp(); //object 無效

2.instanceof

instanceof 是用來判斷 A 是否為 B 的實例兴蒸,表達(dá)式為:A instanceof B,如果 A 是 B 的實例细办,則返回 true,否則返回 false橙凳。 在這里需要特別注意的是:instanceof 檢測的是原型。我們用一段偽代碼來模擬instanceof內(nèi)部執(zhí)行過程:

instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        //A的內(nèi)部屬性__proto__指向B的原型對象
        return true;
    }
    return false;
}

從上述過程可以看出笑撞,當(dāng) A 的 proto 指向 B 的 prototype 時岛啸,就認(rèn)為A就是B的實例,我們再來看幾個例子:

[] instanceof Array; //true
[] instanceof Object; //true
new Date() instanceof Date;//true
new Date() instanceof Object;//true
function Person(){};
new Person() instanceof Person;//true
new Person() instanceof Object;//true

我們發(fā)現(xiàn)茴肥,雖然 instanceof 能夠判斷出 [] 是Array的實例坚踩,但它認(rèn)為 [] 也是Object的實例,為什么呢瓤狐? 我們來分析一下[]瞬铸、Array批幌、Object 三者之間的關(guān)系: 從instanceof 能夠判斷出 [].proto 指向 Array.prototype, 而 Array.prototype.proto 又指向了Object.prototype嗓节,Object.prototype.proto 指向了null,標(biāo)志著原型鏈的結(jié)束荧缘。因此,[]拦宣、Array截粗、Object就形成了如下圖所示的一條原型鏈:

image.png

從原型鏈可以看出,[] 的 proto 直接指向Array.prototype, 間接指向Object.prototype, 所以按照 instanceof 的判斷規(guī)則鸵隧,[] 就是Object的實例绸罗。

3.toString

前面的typeof和instanceof都有一定局限性,最后一個toString是比較萬能的方法豆瘫。

toString() 是 Object 的原型方法珊蟀,調(diào)用該方法,默認(rèn)返回當(dāng)前對象的 [[Class]] 外驱。這是一個內(nèi)部屬性系洛,其格式為 [object Xxx] ,其中 Xxx 就是對象的類型略步。

對于 Object 對象,直接調(diào)用 toString() 就能返回 [object Object] 定页。而對于其他對象趟薄,則需要通過 call / apply 來調(diào)用才能返回正確的類型信息。

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
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(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object Window]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末典徊,一起剝皮案震驚了整個濱河市杭煎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卒落,老刑警劉巖羡铲,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儡毕,居然都是意外死亡也切,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門腰湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷恃,“玉大人,你說我怎么就攤上這事费坊〉够保” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵附井,是天一觀的道長讨越。 經(jīng)常有香客問我两残,道長,這世上最難降的妖魔是什么把跨? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任人弓,我火速辦了婚禮,結(jié)果婚禮上节猿,老公的妹妹穿的比我還像新娘票从。我一直安慰自己,他們只是感情好滨嘱,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布峰鄙。 她就那樣靜靜地躺著,像睡著了一般太雨。 火紅的嫁衣襯著肌膚如雪吟榴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天囊扳,我揣著相機(jī)與錄音吩翻,去河邊找鬼。 笑死锥咸,一個胖子當(dāng)著我的面吹牛狭瞎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搏予,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熊锭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雪侥?” 一聲冷哼從身側(cè)響起碗殷,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎速缨,沒想到半個月后锌妻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡旬牲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年仿粹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片原茅。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牍陌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出员咽,到底是詐尸還是另有隱情毒涧,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站契讲,受9級特大地震影響仿吞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捡偏,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一唤冈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧银伟,春花似錦你虹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琉预,卻和暖如春董饰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圆米。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工卒暂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娄帖。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓也祠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親近速。 傳聞我的和親對象是個殘疾皇子齿坷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355