數(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ù)類型判斷的四種方法
-
typeof
typeof的返回值有6種:“number”谱俭、”string”、”boolean”宵蛀、”object”昆著、”function”、”undefined"
typeof對(duì)于基本數(shù)據(jù)類型判斷是沒有問題的糖埋,但是遇到引用數(shù)據(jù)類型(如:Array)是不起作用的宣吱,返回object
typeof [] ; //object
- 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
- 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)判斷。
- 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