js數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)類型判斷

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

js的數(shù)據(jù)類型有七種,其中有六種基本類型:null憨闰,undefined状蜗,boolean,string鹉动,number轧坎,symbol;以及一種引用類型:object

數(shù)據(jù)類型的轉(zhuǎn)換

顯式轉(zhuǎn)換

一. 將非數(shù)值轉(zhuǎn)換為數(shù)值類型的函數(shù) :Number(); parseInt(), parseFloat()
Number() 函數(shù)轉(zhuǎn)換規(guī)則:

  • boolean:true轉(zhuǎn)換為1泽示,false轉(zhuǎn)換為0
  • number:原樣輸出
  • undefined:輸出NaN
  • null:輸出0
  • 字符串:
    字符串中只包含數(shù)字(可帶正負(fù)號(hào)缸血,可為整數(shù)或小數(shù)):轉(zhuǎn)為帶正負(fù)號(hào)的十進(jìn)的整數(shù)或小數(shù),且忽略前導(dǎo)0械筛;
    字符串為十六進(jìn)制捎泻,轉(zhuǎn)為十進(jìn)制;
    空字符串:0埋哟;
    其他:NaN
  • 對(duì)象:如果是對(duì)象笆豁,則調(diào)用對(duì)象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值赤赊。如果轉(zhuǎn)換的結(jié)果是NaN渔呵,則調(diào)用對(duì)象的toString()方法,然后再次按照前面的規(guī)則轉(zhuǎn)換返回的字符串值

parseInt(string [,radix])
parseInt不遵循四舍五入砍鸠,radix的取值可為2-32
對(duì)于非字符串類型扩氢,先轉(zhuǎn)換為字符串
從左向右遍歷字符串,直到碰到非數(shù)字字符進(jìn)行“截?cái)唷币瑁蝗绻谝粋€(gè)字符就是非數(shù)字字符录豺,轉(zhuǎn)換為NaN

var num = ["123" , "124.4" , "234asd" , "asf456"] ;
  for (i = 0; i < num.length; i++) {
   console.log(parseInt(num[i]));   
  }     //123 , 124 饭弓, 234 双饥, NaN 


parseInt('')  //NaN
parseInt(null)  //NaN
parseInt(undefined)  //NaN

二. 將其它類型的數(shù)據(jù)轉(zhuǎn)換為字符串類型的函數(shù)
2.1 String(mix):將mix轉(zhuǎn)換成字符串類型。該函數(shù)可以將任何數(shù)據(jù)類型的值轉(zhuǎn)換為字符串弟断。
2.2 toString():
num.toString([radix]) :可以將數(shù)值(或其他除null咏花,undefined外的數(shù)據(jù)類型)轉(zhuǎn)換為字符類型,radix可選阀趴;
例:把一個(gè)二進(jìn)制的數(shù)10001000轉(zhuǎn)換成十六進(jìn)制的數(shù)昏翰。

var num1 = parseInt('10001000',2);  //136
var num2 = num1.toString(16);  //'88'

三. 將值轉(zhuǎn)換成布爾值類型:Boolean()
只有這七個(gè)值會(huì)返回false:undefined, null, -0, +0, NaN, ''(空字符), false; 其他情況都會(huì)返回true

Boolean(1) ;//返回true
Boolean("0");//返回true
Boolean("abc");//返回true
Boolean([]); // true
Boolean({}); // true
Boolean(new Boolean(false))// true
Boolean(false);//返回false
Boolean('');//返回false
Boolean(0);//返回false

隱式轉(zhuǎn)換

這里說(shuō)的隱性類型轉(zhuǎn)換,是==引起的轉(zhuǎn)換刘急。

如果存在NaN棚菊,一律返回false
再看有沒有布爾,有布爾就將布爾轉(zhuǎn)換為數(shù)字
接著看有沒有字符串, 有三種情況叔汁,對(duì)方是對(duì)象统求,對(duì)象使用toString進(jìn)行轉(zhuǎn)換检碗;對(duì)方是數(shù)字,字符串轉(zhuǎn)數(shù)字码邻;對(duì)方是字符串折剃,直接比較;其他返回false
如果是數(shù)字像屋,對(duì)方是對(duì)象微驶,對(duì)象取valueOf進(jìn)行比較, 其他一律返回false
null, undefined不會(huì)進(jìn)行類型轉(zhuǎn)換, 但它們倆相等
這個(gè)順序一定要死記,這是面試時(shí)經(jīng)常問到的开睡。

0 == []; // true, 0 == [].toString(); ---> 0 == 0;
'0' == []; // false, '0' == [].toString(); ---> '0' == '';
2 == ['2']; // true, 2 == ['2'].valueOf(); ---> 2 == '2' ---> 2 == 2;
'2' == [2]; // true, '2' == [2].toString(); ---> '2' =='2';
 
[] == ![]; //true, [] == !Boolean([]), [] == false, [] == 0 ---> 0 == 0;

0 == undefined  //false
1 == true       //true
2 == {valueOf: function(){return 2}}        //true
NaN == NaN  //false
 8 == undefined //false
1 == undefined  //false
 null == {toString: function(){return 2}}       //false
 0 == null      //false
 null == 1      //false
 1 == { toString:function(){ return 1 } , valueOf:function(){ return [] }}      //true

//typeof(null)              "object"
//typeof(undefined)         "undefined"

//undefined和null在進(jìn)行相等判斷時(shí)不進(jìn)行類型轉(zhuǎn)換
//null>0屬于關(guān)系運(yùn)算符因苹,不屬于相等運(yùn)算符,null會(huì)被當(dāng)成對(duì)象篇恒,然后轉(zhuǎn)為0扶檐,再進(jìn)行判斷

//undefined相等判斷時(shí)不發(fā)生類型轉(zhuǎn)換,判斷大于小于時(shí)也不發(fā)生類型轉(zhuǎn)換
 console.log(undefined == undefined);  //true
 console.log(undefined == 0);       //false
 console.log(undefined >= 0);             //false
 console.log(undefined > 0);        //false
 console.log(undefined < 0);        //false
 
//null相等判斷時(shí)不發(fā)生類型轉(zhuǎn)換胁艰,判斷大于小于時(shí)會(huì)發(fā)生類型轉(zhuǎn)換
 console.log(null == null);        //true
 console.log(null >= 0);          //true
 console.log(null == 0);          //false
 console.log(null > 0);          //false
 console.log(null < 0);          //false
 console.log(undefined == null);    //true 


 //注意:
 console.log(null >= 0);          //true
 console.log(undefined >= 0);             //false

隱式轉(zhuǎn)換為字符
  • 任何數(shù)據(jù)類型+""(無(wú)論是空字符串還是其他字符串款筑,任何數(shù)據(jù)類型加字符串都變成字符串)
var a;
var b = a + "";
console.log(typeof b + " " + b);

a = null;
b = a + "";
console.log(typeof b + " " + b);

a = 123;
b = a + "";
console.log(typeof b + " " + b);

a = true;
b = a + "";
console.log(typeof b + " " + b);

11+'11'         //'1111'

null+"3"        //"null3"

隱式轉(zhuǎn)換為數(shù)值

+‘3’ //     3   注意與null+'3'的區(qū)別!
+ture   //1
‘10’-20  // -10
10-‘one’  //   NaN
隱式轉(zhuǎn)換為boolean

!!num 相當(dāng)于調(diào)用 Boolean(num)

關(guān)于null == 0

要比較相等性之前腾么,不能將null和undefined轉(zhuǎn)換成其他任何值奈梳。就是undefined和null與其他數(shù)在進(jìn)行相等判斷時(shí)不進(jìn)行類型轉(zhuǎn)換。
null == undefined,這個(gè)是true

null>0 //null轉(zhuǎn)化為number解虱,為0攘须,所以0>0結(jié)果為false。
null>=0 //null轉(zhuǎn)化為number殴泰,為0>=0于宙,所以結(jié)果為true。
null==0// null在做相等判斷時(shí)悍汛,不進(jìn)行轉(zhuǎn)型捞魁,所以null和0為不同類型數(shù)據(jù),結(jié)果為false

關(guān)于NaN

NaN屬于number類型,NaN與任何值都不相等
方法 parseInt() 和 parseFloat() 在不能解析指定的字符串時(shí)就返回這個(gè)值离咐。

typeof(NaN)     //number
NaN === NaN   //false

注意Number.isNaN()和isNaN的區(qū)別:

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Math.sqrt(-2))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['x'])); // false
console.log(Number.isNaN({})); // false


console.log(isNaN('hello')); // true
console.log(isNaN(['x'])); // true
console.log(isNaN({})); // true

數(shù)據(jù)類型判斷的四種方法

  1. typeof

    typeof的返回值有6種:“number”谱俭、”string”、”boolean”宵蛀、”object”昆著、”function”、”undefined"
    typeof對(duì)于基本數(shù)據(jù)類型判斷是沒有問題的糖埋,但是遇到引用數(shù)據(jù)類型(如:Array)是不起作用的宣吱,返回object

typeof [] ; //object
  1. instanceof
    instanceof 是用來(lái)判斷 A 是否為 B 的實(shí)例窃这,表達(dá)式為:A instanceof B瞳别,如果 A 是 B 的實(shí)例征候,則返回 true,否則返回 false。 在這里需要特別注意的是:instanceof 檢測(cè)的是原型祟敛,我們用一段偽代碼來(lái)模擬其內(nèi)部執(zhí)行過(guò)程:
instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        // A的內(nèi)部屬性 __proto__ 指向 B 的原型對(duì)象
        return true;
    }
    return false;
}

從上述過(guò)程可以看出疤坝,當(dāng) A 的 proto 指向 B 的 prototype 時(shí),就認(rèn)為 A 就是 B 的實(shí)例馆铁,我們?cè)賮?lái)看幾個(gè)例子

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

instanceof 只能用來(lái)判斷兩個(gè)對(duì)象是否屬于實(shí)例關(guān)系跑揉, 而不能判斷一個(gè)對(duì)象實(shí)例具體屬于哪種類型。

instanceof 操作符的問題在于埠巨,它假定只有一個(gè)全局執(zhí)行環(huán)境历谍。如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí)際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境辣垒,從而存在兩個(gè)以上不同版本的構(gòu)造函數(shù)望侈。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)勋桶。

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[0].Array;
var arr = new xArray(1,2,3); // [1,2,3]
arr instanceof Array; // false

針對(duì)數(shù)組的這個(gè)問題脱衙,ES5 提供了 Array.isArray() 方法 。該方法用以確認(rèn)某個(gè)對(duì)象本身是否為 Array 類型例驹,而不區(qū)分該對(duì)象在哪個(gè)環(huán)境中創(chuàng)建捐韩。

注意:

console.log("1" instanceof String);  //false
console.log(1 instanceof Number);  //false
console.log(true instanceof Boolean);  //false

new Number(1) instanceof Number;  //true
new String('1') instanceof Number;  //true
new Boolean(false) instanceof Number;  //true
  1. constructor

函數(shù)的 constructor 是不穩(wěn)定的,這個(gè)主要體現(xiàn)在自定義對(duì)象上鹃锈,當(dāng)開發(fā)者重寫 prototype 后荤胁,原有的 constructor 引用會(huì)丟失,constructor 會(huì)默認(rèn)為 Object

function Fn(){};

Fn.prototype=new Array();

var f=new Fn();
console.log(f.constructor===Fn);  //false
console.log(f.constructor===Array);  //true

null 和 undefined 是無(wú)效的對(duì)象屎债,因此是不會(huì)有 constructor 存在的寨蹋,這兩種類型的數(shù)據(jù)需要通過(guò)其他方式來(lái)判斷。

  1. Object.prototype.toString.call(true)
Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
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 global] window 是全局對(duì)象 global 的引用

參考鏈接
數(shù)據(jù)類型轉(zhuǎn)換
https://www.jb51.net/article/136520.htm
https://www.jb51.net/article/136521.htm
https://blog.csdn.net/qq2071114140/article/details/92478526
https://blog.csdn.net/luckydie/article/details/77948097
https://blog.csdn.net/Doulvme/article/details/83104683
判斷數(shù)據(jù)類型
https://www.cnblogs.com/onepixel/p/5126046.html
https://www.cnblogs.com/zt123123/p/7623409.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扔茅,一起剝皮案震驚了整個(gè)濱河市已旧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌召娜,老刑警劉巖运褪,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異玖瘸,居然都是意外死亡秸讹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門雅倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)璃诀,“玉大人,你說(shuō)我怎么就攤上這事蔑匣×踊叮” “怎么了棕诵?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凿将。 經(jīng)常有香客問我校套,道長(zhǎng),這世上最難降的妖魔是什么牧抵? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任笛匙,我火速辦了婚禮,結(jié)果婚禮上犀变,老公的妹妹穿的比我還像新娘妹孙。我一直安慰自己,他們只是感情好获枝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布涕蜂。 她就那樣靜靜地躺著,像睡著了一般映琳。 火紅的嫁衣襯著肌膚如雪机隙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天萨西,我揣著相機(jī)與錄音有鹿,去河邊找鬼。 笑死谎脯,一個(gè)胖子當(dāng)著我的面吹牛葱跋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播源梭,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼娱俺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了废麻?” 一聲冷哼從身側(cè)響起荠卷,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烛愧,沒想到半個(gè)月后油宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怜姿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年慎冤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沧卢。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚁堤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出但狭,到底是詐尸還是另有隱情披诗,我是刑警寧澤撬即,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站藤巢,受9級(jí)特大地震影響搞莺,放射性物質(zhì)發(fā)生泄漏息罗。R本人自食惡果不足惜掂咒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迈喉。 院中可真熱鬧绍刮,春花似錦、人聲如沸挨摸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)得运。三九已至膝蜈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熔掺,已是汗流浹背饱搏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留置逻,地道東北人推沸。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像券坞,于是被迫代替她去往敵國(guó)和親鬓催。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345