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

一、7種數(shù)據(jù)類型(6種基本赦邻,及引用類型)

1.Null
只有一個(gè) 值 : null 
①聲明一個(gè)對(duì)象為null囚玫,則為:銷毀該變量
②返回null,則為該對(duì)象不存在昨忆。typeof Null  === 'Object'

2.Undefined
只有一個(gè) 值 : undefined 
代表對(duì)象存在丁频,但未賦值
當(dāng)聲明的變量未初始化時(shí),該變量的默認(rèn)值是 undefined
函數(shù)沒有明確返回值時(shí)扔嵌,返回undefined

3.Boolean
只有兩個(gè) 值 : true限府、false 

4.Number
 值 : 數(shù)字 
特殊的Number值:Number.MAX_VALUE 和 Number.MIN_VALUE、NaN
NaN痢缎;//表示非數(shù)(Not a Number)一般說(shuō)來(lái)胁勺,這種情況發(fā)生在類型(String、Boolean 等)轉(zhuǎn)換失敗時(shí)返回的值 或 數(shù)字/0 

5.String
值 : 字符串 

6.Symbol
可以用于命名沖突及私有屬性 

7.引用類型
所有對(duì)象都是繼承Object.prototype

二独旷、定義方式

  • 字面量
  • 轉(zhuǎn)換函數(shù) =>基本數(shù)據(jù)類型
  • new=> 引用類型

三署穗、對(duì)象裝包和解包概念

  • 自動(dòng)裝包:比如Object.prototype.toString.call(A)
    如果A是基本數(shù)據(jù)類型,則會(huì)自動(dòng)裝包嵌洼。即區(qū)分不出3和new Number(3)
  • 解包:ToPrimitive() 引用類型==判斷時(shí)會(huì)調(diào)用

四案疲、類型轉(zhuǎn)換

1.轉(zhuǎn)Boolean

顯示語(yǔ)法:Boolean(value)//轉(zhuǎn)換函數(shù)
隱式方式:條件語(yǔ)句中

1.Null       // null 
2.Undefined  // undefined  
3.Boolean    // false 
4.Number     // +0,-0,NaN 
5.String     // ""  以上這部分為false 
6.Object     // 引用類型轉(zhuǎn)換為布爾,始終為true 

2.轉(zhuǎn)Number

顯示語(yǔ)法:Number(value)//轉(zhuǎn)換函數(shù)麻养。褐啡。。其它方法:parseFloat()鳖昌,parseInt() 
隱式方式:一元運(yùn)算符 +备畦。eg:{var x="5",var y=+x;//則x為number類型}

1.Null      // 0 
2.Undefined // NaN 
3.Boolean    // false為0,true為1 
4.Number     //  可以轉(zhuǎn)其它進(jìn)制
5.String     // 有其它字符许昨,則返回NaN,如只有連續(xù)數(shù)字(首位允許有空格)懂盐,則返回?cái)?shù)字 
6.Object     // NaN,除了[]為0糕档,[15]為15莉恼,[15,20]也為NaN 

總結(jié):如果沒辦法轉(zhuǎn)化為數(shù)字,則為NaN
其中,Null表示空對(duì)象俐银,為0
Undefined 表示沒有定義值尿背,值是未知的,為NaN

3.轉(zhuǎn)String

顯示語(yǔ)法:String(s);    //轉(zhuǎn)換函數(shù)
隱式方式:"+"運(yùn)算符

1.Null        // "null" 
2.Undefined   // "undefined" 
3.Boolean     // false為"false"悉患,true為"true" 
4.Number      // "對(duì)應(yīng)數(shù)字" //0,+0,-0為0
5.String      //
6.Object      // Object為:"[object Object]"残家; function為:"function(){}";數(shù)組為:"數(shù)組內(nèi)容1售躁,數(shù)組內(nèi)容2" 

五坞淮、相等判斷

  • == :相等運(yùn)算法

A==B 類型轉(zhuǎn)換規(guī)則

  • A、B同一類型陪捷,則等價(jià)于A===B
  • A回窘、B不同類型,則非數(shù)字類型的市袖,ToNumber(A)或ToPrimitive(A)
  • 總結(jié):相同類型啡直,直接===,否則轉(zhuǎn)數(shù)字再比較
  • 相關(guān)鏈接
  • ===嚴(yán)格相等運(yùn)算符:對(duì)比==增加了類型的判斷(typeof)苍碟。都一致才相等
  • Object.is():對(duì)比==酒觅、===修復(fù)了特殊值的相等判斷:NaN、+0微峰,-0
1.== 
a.比較的是值 
b.如果類型不同舷丹,會(huì)自動(dòng)轉(zhuǎn)換成同一類型進(jìn)行比較值。[]==0為true
c.null和undefined盡管有不同蜓肆,但是都表示“值的空缺”颜凯。用“==”認(rèn)為兩者相等
總結(jié):
會(huì)自動(dòng)類型轉(zhuǎn)換
站在值的角度,null和undefined都表示“值的空缺”仗扬,用“==”認(rèn)為兩者相等
適用于只是值的比較症概,比如后臺(tái)給的數(shù)據(jù)(對(duì)類型并不知情),剛好==會(huì)忽略類型

2.===
a.比較的是值和類型早芭,先對(duì)比類型彼城,類型不一樣,為false退个。類型相同則對(duì)比值 
b.+0和-0或0,雖然看起來(lái)不一樣,因?yàn)轭愋拖嗤狄蚕嗟?為true
c.NaN和NaN之間精肃,為false 
d.基礎(chǔ)類型和引用類型之間:因?yàn)轭愋筒煌瑸閒alse帜乞。
e.引用類型之間:盡管object,array,function不一樣,但都是屬于引用類型筐眷,對(duì)比值(物理地址)即同一對(duì)象的引用為true黎烈,否則為false
總結(jié):
對(duì)比==只是增加了個(gè)類型判斷。類型判斷方式為typeof
適用于嚴(yán)格的判斷

3.Object.is()
==缺點(diǎn):會(huì)進(jìn)行類型轉(zhuǎn)換eg:"10"==[10]==10類似問(wèn)題,及[]==0為true
===缺點(diǎn):沒辦法區(qū)分0===-0為true及NaN===NaN為false
Object.is()修復(fù)了===的缺點(diǎn):Object.is(+0,-0)為false 及 Object.is(NaN,NaN)為true

總結(jié)

  1. 后臺(tái)給的數(shù)據(jù)照棋,用==
  2. 精確判斷用===
  3. Object.is()對(duì)比===就是嚴(yán)格區(qū)分+-0(這里一般不會(huì)區(qū)分)资溃,及NaN=>建議,直接用isNaN()即可烈炭,少用Object.is()

五溶锭、類型判斷

1.基本類型判斷 typeof

a.語(yǔ)法:typeof 變量;eg:typeof "zzz";//string

b.返回的是字符串:"undefined","number"符隙,"boolean"趴捅,"string","function"霹疫,"object"

c.判斷方式:typeof 變量==="undefined"/"number"等基本數(shù)據(jù)類型

總結(jié):
1.對(duì)于基本類型拱绑,除 null 以外,均可以返回正確的類型丽蝎。typeof null為objecct(null表示空引用猎拨,即不存在)

2.對(duì)于引用類型,除 function 以外屠阻,一律返回 object 類型红省。typeof 函數(shù)名為function
  • 說(shuō)明:類型,其實(shí)也是0101來(lái)標(biāo)識(shí)的 這就是typeof 的原理国觉。
  • 總結(jié)
  • 可以用于基本類型的判斷吧恃,但認(rèn)不出Null,引用類型只能識(shí)別object及function
  • 屬于物理級(jí)別的類型判斷,比較粗糙蛉加,但是最原始的蚜枢。

2.引用類型判斷 constructor instanceof Object.prototype.toString.call()

1.constructor
語(yǔ)法:obj.constructor;//返回的是對(duì)象的構(gòu)造函數(shù)
使用:obj.constructot===Class;
例子:child.constructor===Child;
console.log((2).constructor === Number);
console.log((true).constructor === Boolean);
console.log(('str').constructor === String);
console.log(([]).constructor === Array);
console.log((function() {}).constructor === Function);
console.log(({}).constructor === Object);
問(wèn)題:要確保原型的constructor指向了該對(duì)象的父類
  • 從構(gòu)造函數(shù)角度:constructor總結(jié)
  • 優(yōu)點(diǎn):可以判斷自定義類型
  • 缺點(diǎn):如果修改了其構(gòu)造函數(shù)指針,則失效
2.instanceof
語(yǔ)法:obj instanceof Class;
//返回针饥,布爾值厂抽。如果為true,說(shuō)明Class.prototype是obj祖先原型
//instanceof 運(yùn)算符用來(lái)檢測(cè) constructor.prototype 是否存在于參數(shù) object 的原型鏈上
instanceof模擬代碼 
function instance_of(obj,arg_Class){
    while(true){
       if (obj===null) return false;  //如果對(duì)象為空,或者找到對(duì)象的最后原型為空丁眼,函數(shù)返回筷凤,為false
       if (obj===arg_Class.property) return true;  //如果和祖先類相等,函數(shù)返回苞七,為true
       obj =obj.__proto__; //查找原型鏈 
    }
}
Function instanceof Function;//true   Function它的父類是Function               Function._proto_=Function.prototype
Object instanceof Function;  //true   Object它的父類是Function                 Object._proto_=Function.prototype
Function instanceof Object;  //true   Function它的祖先原型是Object.prototype   Function._proto_._proto_=Object.prototype
Object instanceof Object;    //true   Object它的祖先原型是Object.prototype     Object._proto_._proto_=Object.prototype
Number instanceof Number;    //false  其它類型它的父類是Object  
總結(jié):
1.用于引用對(duì)象的類型檢查藐守, t  instanceof Array
2.用于判斷是不是某個(gè)類的實(shí)例
  • 從原型角度:instanceof總結(jié)
  • 用途:用于檢測(cè)是不是某個(gè)原型的實(shí)例
  • 缺點(diǎn):用于檢測(cè)類型,不夠精確
3.Object.prototype.toString.call()
a.語(yǔ)法:Object.prototype.toString.call(變量)  
b.返回的是字符串:"[object String]"蹂风,"[object Number]"卢厂,"[object Boolean]"
"[object Object]","[object Array]"惠啄,"[object Date]"慎恒,"[object Function]"
c.判斷方式:Object.prototype.toString.call(a) === '[object String]'/ '[object Number]'等原生引用類型 
  • Object.prototype.toString.call()總結(jié)
  • 原理
    每個(gè)引用類型任内,內(nèi)部有[[class]]標(biāo)識(shí)是哪種數(shù)據(jù)類型;
    Object.toString()輸出其值融柬;Object.property.toString()輸出其類型
  • 優(yōu)點(diǎn):原生引用類型全都支持(js有17種內(nèi)置對(duì)象)
  • 注意:如果對(duì)基本數(shù)據(jù)類型使用死嗦,則是對(duì)其裝箱再使用即區(qū)分不出3和new Number(3);

3粒氧、類型判斷總結(jié)

  • 基本數(shù)據(jù)類型越除,用typeof:但識(shí)別不出null。引用類型只能識(shí)別為object或function外盯;
  • 引用類型摘盆,用Object.prototype.toString.call()。完美门怪。
  • 自定義類的實(shí)例骡澈,想知道族譜或母親用instanceof 和constructor
類型檢測(cè)函數(shù)
/**
 *類型判斷
 * @param {*} value
 */
function type(value){
    let mapTolower={};
    // 生成mapTolower映射,底下訪問(wèn)獲得轉(zhuǎn)換后的值
    "Boolean Number String Function Array Date RegExp Object Error Null Undefined".split(" ").forEach(item=>{
      mapTolower["[object " + item + "]"] = item.toLowerCase();
    })

    if (value == null) {//null or undefined(兼容ie寫法)
        return value + "";
    }
    return typeof value === "object" || typeof value === "function" ?
    mapTolower[Object.prototype.toString.call(value)] || "object" :
    typeof value;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掷空,隨后出現(xiàn)的幾起案子肋殴,更是在濱河造成了極大的恐慌,老刑警劉巖坦弟,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护锤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酿傍,警方通過(guò)查閱死者的電腦和手機(jī)烙懦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赤炒,“玉大人氯析,你說(shuō)我怎么就攤上這事≥喊” “怎么了掩缓?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)遵岩。 經(jīng)常有香客問(wèn)我你辣,道長(zhǎng),這世上最難降的妖魔是什么尘执? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任舍哄,我火速辦了婚禮,結(jié)果婚禮上誊锭,老公的妹妹穿的比我還像新娘表悬。我一直安慰自己,他們只是感情好丧靡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布蟆沫。 她就那樣靜靜地躺著叉讥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饥追。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天罐盔,我揣著相機(jī)與錄音但绕,去河邊找鬼。 笑死惶看,一個(gè)胖子當(dāng)著我的面吹牛捏顺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纬黎,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼幅骄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了本今?” 一聲冷哼從身側(cè)響起拆座,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冠息,沒想到半個(gè)月后挪凑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逛艰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年躏碳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片散怖。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菇绵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镇眷,到底是詐尸還是另有隱情咬最,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布偏灿,位于F島的核電站丹诀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翁垂。R本人自食惡果不足惜铆遭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沿猜。 院中可真熱鬧枚荣,春花似錦、人聲如沸啼肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至害碾,卻和暖如春矢劲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慌随。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工芬沉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阁猜。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓丸逸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剃袍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黄刚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容