欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型

 更新時間:2023年08月14日 09:04:01   作者:牛哥說我不優(yōu)雅  
JavaScript中,我們經(jīng)常需要判斷數(shù)據(jù)類型以便于正確地處理數(shù)據(jù),本文將介紹JavaScript中的數(shù)據(jù)類型判斷技術(shù),包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的一些數(shù)據(jù)類型判斷方法,需要的朋友可以參考下

一、前言

在JavaScript中,我們經(jīng)常需要判斷數(shù)據(jù)類型以便于正確地處理數(shù)據(jù)。本文將介紹JavaScript中的數(shù)據(jù)類型判斷技術(shù),包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的一些數(shù)據(jù)類型判斷方法。

二、typeof 操作符

操作符typeof用于判斷一個值的數(shù)據(jù)類型,返回的結(jié)果是一個字符串。常見的typeof返回值包括"`number"、"string"、"boolean"、"undefined"、"object"和"function"。

console.log(typeof 'hello');    //輸出: string
console.log(typeof('hello'));   //輸出: string
console.log(typeof 666);        //輸出: number
console.log(typeof(666));       //輸出: number
console.log(typeof true);       //輸出: boolean
console.log(NaN);               //輸出: NaN
console.log(typeof NaN);        //輸出: number
console.log(typeof undefined);  //輸出: undefined
console.log(typeof new Date()); //輸出: object
console.log(typeof null);       //輸出: object
console.log(typeof []);         //輸出: object
console.log(typeof {});         //輸出: object
console.log(typeof function() {});  //輸出: function

需要注意的是,typeof null返回的是object而不是nulltypeof能判斷除了null之外的所有數(shù)據(jù)類型。這是一個歷史遺留問題,不能用來判斷null值。如果要判斷null值,可以使用"==="運算符。 typeof判斷所有引用類型都是輸出object,除了函數(shù)function,用typeof判斷函數(shù)類型輸出的是function。

三、instanceof 操作符

instanceof操作符用于判斷一個對象是否屬于某個類(構(gòu)造函數(shù))的實例。它會檢查對象的原型鏈?zhǔn)欠癜瑯?gòu)造函數(shù)的原型對象。

console.log("hello world" instanceof String)   //false
console.log(new String("hello world") instanceof String) //true
console.log(666 instanceof Number)   //false
console.log(new Number(666) instanceof Number) //true
console.log(true instanceof Boolean) //false
console.log([] instanceof Array)     //true
console.log({} instanceof Object)    //true
console.log(null instanceof null)    //報錯
console.log(undefined instanceof undefined) //報錯

需要注意的是,typeof null返回的是object而不是null,typeof能判斷除了null之外的所有數(shù)據(jù)類型。這是一個歷史遺留問題,不能用來判斷null值。如果要判斷null值,可以使用"==="運算符。 typeof判斷所有引用類型都是輸出object,除了函數(shù)function,用typeof判斷函數(shù)類型輸出的是function。

四、Object.prototype.toString 方法

Object.prototype.toString方法可以返回一個對象的數(shù)據(jù)類型。它比typeofinstanceof更加準(zhǔn)確和全面,可以判斷基本數(shù)據(jù)類型和各種對象類型。

console.log(Object.prototype.toString(undefined));    //[object Object]
console.log(Object.prototype.toString(666));          //[object Object]
console.log(Object.prototype.toString.call(undefined))//[object Undefined]
console.log(Object.prototype.toString.call(null));    //[object Null]  
console.log(Object.prototype.toString.call(666));     //[object Number]  
console.log(Object.prototype.toString.call('abc'));   //[object String]  
console.log(Object.prototype.toString.call(NaN));     //[object Number] 
console.log(Object.prototype.toString.call([1,2,3])); //[object Array] 
console.log(Object.prototype.toString.call({a:1,b:2}))//[object Object] 
console.log(Object.prototype.toString.call(function(){}))//[object Function] 
console.log(Object.prototype.toString.call(new Date()))//[object Date]
console.log(Object.prototype.toString.call(arguments)) //[object Arguments]

需要注意的是,如果不加上call,就會輸出[object Object],加上后才能準(zhǔn)確判斷。我們仔細(xì)觀察一下,發(fā)現(xiàn)輸出的結(jié)果中并不全是我們需要的信息,我們似乎只需要后半部分。那么怎樣只輸出后半部分呢?

Object.prototype.toString(undefined).slice(8,-1)       //Object
Object.prototype.toString(666).slice(8,-1)             //Object
Object.prototype.toString({}).slice(8,-1)              //Object
Object.prototype.toString.call(undefined).slice(8,-1)  //Undefined
Object.prototype.toString.call(null).slice(8,-1)       //Null
Object.prototype.toString.call(666).slice(8,-1)        //Number
Object.prototype.toString.call('abc').slice(8,-1)      //String 
Object.prototype.toString.call(NaN).slice(8,-1)        //Number
Object.prototype.toString.call([1,2,3]).slice(8,-1)    //Array
Object.prototype.toString.call({a:1,b:2}).slice(8,-1)  //Object
Object.prototype.toString.call(function () {}).slice(8,-1) //Function
Object.prototype.toString.call(new Date()).slice(8,-1) //Date

因代碼過長不便展示,請各位自行加上console.log()。前半部分的[object是固定的,后半部分長度不固定,所以我們這里采用slice(8,-1),8表示從第八位開始截取,不包括第八位,-1表示從右往左數(shù)除掉一位,也就是去掉右中括號。

五、ES6 新增的數(shù)據(jù)類型判斷方法

ES6新增了一些數(shù)據(jù)類型判斷方法,包括Number.isNaNNumber.isFinite、Array.isArray、Object.is等方法。

1. Number.isNaN

Number.isNaN方法用于判斷一個值是否為NaN,它比全局的isNaN方法更加嚴(yán)格,只有在值為NaN時返回true,其他情況都返回false。

console.log(Number.isNaN(NaN));          //true
console.log(Number.isNaN(42));           //false
console.log(Number.isNaN("hello world"));//false
console.log(Number.isNaN(undefined));    //false
console.log(Number.isNaN(null));         //false

2. Number.isFinite

Number.isFinite方法用于判斷一個值是否為有限數(shù)值,它在值為Infinity、-InfinityNaN時返回false,其他情況都返回true。Number.isFinite只能判斷數(shù)值類型的數(shù)據(jù)是否為有限數(shù)值,對于其他數(shù)據(jù)類型返回都是false。

console.log(Number.isFinite(0));            //true
console.log(Number.isFinite(-16));          //true
console.log(Number.isFinite(42));           //true
console.log(Number.isFinite(Infinity));     //false
console.log(Number.isFinite(-Infinity));    //false
console.log(Number.isFinite(NaN));          //false
console.log(Number.isFinite("hello world"));//false
console.log(Number.isFinite(undefined));    //false
console.log(Number.isFinite(null));         //false
console.log(Number.isFinite(true));         //false

3. Array.isArray

Array.isArray方法用于判斷一個值是否為數(shù)組類型。

console.log(Array.isArray([]));           //true
console.log(Array.isArray([1, 2, 3]));    //true
console.log(Array.isArray({}));           //false
console.log(Array.isArray("hello world"));//false
console.log(Array.isArray(undefined));    //false
console.log(Array.isArray(null));         //false

4. Object.is

Object.is方法用于比較兩個值是否相等,它比全局的===運算符更加嚴(yán)格,可以判斷NaN值和-0+0的差別,使用Object.is方法能夠更加準(zhǔn)確地比較兩個值是否相等。

console.log(Object.is(42, 42));     //true
console.log(Object.is("hello world", "hello world"));//true
console.log(Object.is(NaN, NaN));   //true
console.log(Object.is(+0, -0));     //false
console.log(Object.is('666', 666)); //false
console.log(Object.is(true, 1));    //false
console.log(Object.is(true, 'true')); //false

六、NaN 和 "== 、==="

在實際編寫JavaScript程序時,需要注意一些細(xì)節(jié)問題,以避免出現(xiàn)不必要的錯誤或者行為不符合預(yù)期的情況。以下是一些常見的問題和解決方法。

1. NaN

NaNNot A Number的縮寫,NaN不是一種數(shù)據(jù)類型,它屬于number類型,NaN是一個特殊的值,與任何值都不相等,包括它自己。因此,判斷一個值是否為NaN需要使用isNaN()函數(shù)。

2. ==(兩個等號)和 ===(三個等號)

在JavaScript中,=====都是用來比較兩個值是否相等的運算符。它們的主要區(qū)別在于比較的嚴(yán)格程度和類型轉(zhuǎn)換的方式。
==(相等運算符):在進(jìn)行比較時會進(jìn)行類型轉(zhuǎn)換,如果兩個值的類型不同,會將它們轉(zhuǎn)換為相同的類型再進(jìn)行比較。
===(嚴(yán)格相等運算符):在進(jìn)行比較時不會進(jìn)行類型轉(zhuǎn)換,如果兩個值的類型不同,直接返回false。

console.log(1 == "1");          //true
console.log(1 === "1");         //false
console.log(0 == false);        //true
console.log(0 === false);       //false
console.log(null == undefined); //true,
console.log(null === undefined);//false

因為nullundefined都是JavaScript中的特殊值,使用==時被認(rèn)為是相等的。

需要注意的是,由于==會進(jìn)行類型轉(zhuǎn)換,因此可能會出現(xiàn)一些奇怪的結(jié)果。

console.log(null == 0); //false,null會被轉(zhuǎn)換為數(shù)字0
console.log(null < 1);  //true,null會被轉(zhuǎn)換為數(shù)字0
console.log("5" == 5);  //true,字符串"5"會被轉(zhuǎn)換為數(shù)字5
console.log(true == 1); //true,true會被轉(zhuǎn)換為數(shù)字1

需要注意,雖然null會被轉(zhuǎn)成數(shù)字0,但是null == 0仍然輸出false。 因此,在比較兩個值時,建議使用===,這樣可以避免由于類型轉(zhuǎn)換等原因?qū)е碌腻e誤比較。

七、總結(jié)

本文介紹了JavaScript中常見的數(shù)據(jù)類型判斷方法,包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的數(shù)據(jù)類型判斷方法。通過這些技術(shù),我們可以準(zhǔn)確地判斷數(shù)據(jù)類型,從而正確地處理數(shù)據(jù)。需要根據(jù)具體情況選擇合適的方法來判斷數(shù)據(jù)類型,以便于代碼的可讀性和可維護(hù)性。

以上就是詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型的詳細(xì)內(nèi)容,更多關(guān)于判斷JavaScript數(shù)據(jù)類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論