一、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é)
后臺(tái)給的數(shù)據(jù)照棋,用==
精確判斷用===
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;
}