JavaScript中確定值的類型的三種方法
JavaScript是一種弱類型語(yǔ)言,當(dāng)你給一個(gè)變量賦了一個(gè)值,該值是什么類型的,那么該變量就是什么類型的,并且你還可以給一個(gè)變量賦多種類型的值,也不會(huì)報(bào)錯(cuò),這就是JavaScript的內(nèi)部機(jī)制所決定的,那么當(dāng)我們?cè)谑褂靡恍┓椒ǖ臅r(shí)候,必須知道該變量是什么類型的,才能調(diào)用該變量對(duì)應(yīng)的一些方法,那么我們?nèi)绾潍@取到值的變量呢?
這里我們有三種方法
1.typeof 2.instanceof 3.Object.prototype.toString 下面我將詳細(xì)講解一下這三個(gè)方法
typeof:
作用:判斷一個(gè)變量類型
底層原理:js中為了提高性能效率,使用值編碼來存儲(chǔ)值的類型,讀取值編碼當(dāng)中的類型標(biāo)簽位,根據(jù)標(biāo)簽值返回對(duì)應(yīng)的類型字符串
類型判斷流程:先區(qū)分「直接量」與「指針」
直接量表:
| 數(shù)據(jù)類型 | 存儲(chǔ)形式 | 第 0 位 | 類型判定關(guān)鍵 |
|---|---|---|---|
| Boolean | 小整數(shù)(SMI) | 0 | 值為 0 或 2,且最低位為 0(SMI 標(biāo)記)。 |
| Number(SMI) | 32 位有符號(hào)整數(shù)(SMI) | 0 | 值非 0/2,且最低位為 0(SMI 標(biāo)記)。 |
| Undefined | 全局特殊值(單例) | 無 | 直接比較值是否為 undefined 全局變量,typeof 直接返回 "undefined"。 |
指針表:
| 數(shù)據(jù)類型 | 存儲(chǔ)形式 | 低 3 位標(biāo)簽 | 類型判定關(guān)鍵 |
|---|---|---|---|
| 普通 Object | 指針 | 000 | 低 3 位為 000 |
| HeapNumber(浮點(diǎn)數(shù)) | 指針 | 001 | 低 3 位為 001 |
| String | 指針 | 110 | 低 3 位為 110 |
| Symbol | 指針 | 100 | 低 3 位為 100 |
| BigInt | 指針 | 101 | 低 3 位為 101 |
| Function(函數(shù)) | 指針 | 011 | 低 3 位為 011 |
| null | 空指針 | 000 |
這里null比較特殊,他的低三位和對(duì)象object一樣,所以會(huì)被typeof誤判為object對(duì)象
這里舉一些比較常見的事例:
console.log(typeof undefined); // 輸出:"undefined"
console.log(typeof null); // 輸出:"object"
console.log(typeof true); // 輸出:"boolean"
console.log(typeof 42); // 輸出:"number"
console.log(typeof "hello"); // 輸出:"string"
console.log(typeof Symbol("key"));// 輸出:"symbol"
console.log(typeof 100n); // 輸出:"bigint"
console.log(typeof (() => {})); // 輸出:"function"
console.log(typeof {}); // 輸出:"object"
//特殊情況
console.log(typeof /test/g); // "object"
console.log(typeof Infinity); // "number"
console.log(typeof NaN); // "number"
console.log(typeof undeclaredVar); // "undefined"(不會(huì)報(bào)錯(cuò))instanceof:
概念:instanceof 是一種操作符,用于判斷一個(gè)對(duì)象是否是某個(gè)類(Class)或接口(Interface)的實(shí)例。這里需要注意的是,instanceof只能判斷對(duì)象,不能判斷基本類型
原理: instanceof 操作符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上 左邊實(shí)例對(duì)象的內(nèi)部屬性通過 Object.getPrototypeOf() 方法來訪問
//這里表示instanceof不能直接用于基本類型
console.log(42 instanceof Number); // false
//可以將基本類型通過內(nèi)置構(gòu)造函數(shù)包裝成對(duì)象
const numObj = new Number(42);
console.log(numObj instanceof Number); // true
console.log([] instanceof Array); // true
console.log([] instanceof Object); // true
console.log({} instanceof Object); // trueObject.prototype.toString:
概念:
這個(gè)方法可以判斷一個(gè)變量的具體類型,是最精確的檢測(cè)方式,返回的是一個(gè)【object type】格式字符串,它可以識(shí)別到所有內(nèi)置對(duì)象的類型
使用方法:
// 基本類型和內(nèi)置對(duì)象
Object.prototype.toString.call({}); // [object Object]
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new Date()); // [object Date]
Object.prototype.toString.call(new MyClass()); // [object Object] (默認(rèn))和typeof對(duì)比:
| 類型 | typeof 結(jié)果 | Object.prototype.toString.call() 結(jié)果 |
|---|---|---|
| [] | "object" | [object Array] |
| new Date() | "object" | [object Date] |
| /abc/ | "object" | [object RegExp] |
| null | "object" | [object Null] |
| undefined | "undefined" | [object Undefined] |
| Symbol(1) | "symbol" | [object Symbol] |
以上就是JavaScript中確定值的類型的三種方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript確定值的類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文詳解如何將Javascript打包成exe可執(zhí)行文件
這篇文章主要介紹了將Javascript打包成exe可執(zhí)行文件的相關(guān)資料,這種方法適用于需要將JavaScript項(xiàng)目打包成單個(gè)獨(dú)立運(yùn)行的可執(zhí)行文件的開發(fā)者,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
基于JS實(shí)現(xiàn)數(shù)字動(dòng)態(tài)變化顯示效果附源碼
我們經(jīng)??吹揭壕щ娮颖順邮?,數(shù)字動(dòng)態(tài)顯示,動(dòng)態(tài)變化的在指定元素內(nèi)顯示數(shù)字。怎么實(shí)現(xiàn)效果呢?下面小編給大家?guī)砹嘶贘S實(shí)現(xiàn)數(shù)字動(dòng)態(tài)變化顯示效果 ,感興趣的朋友一起看看吧2019-07-07
原生js實(shí)現(xiàn)類似彈窗抖動(dòng)效果
這篇文章主要介紹了原生js實(shí)現(xiàn)類似彈窗抖動(dòng)效果的相關(guān)資料,推薦給大家,需要的朋友可以參考下2015-04-04
D3.js中data(), enter() 和 exit()的問題詳解
相信大多數(shù)人對(duì)D3.js并不陌生。這是一個(gè)由紐約時(shí)報(bào)可視化編輯 Mike Bostock與他斯坦福的教授和同學(xué)合作開發(fā)的數(shù)據(jù)文件處理的JavaScript Library,全稱叫做Data-Driven Documents,在d3.js中data(), enter() 和 exit()比較常見,下面給大家就這方面的知識(shí)給大家詳解2015-08-08
JS實(shí)現(xiàn)點(diǎn)擊li標(biāo)簽彈出對(duì)應(yīng)的索引功能【案例】
這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊li標(biāo)簽彈出對(duì)應(yīng)的索引功能,結(jié)合具體實(shí)例形式分析了javascript事件響應(yīng)、元素遍歷等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
JavaScript獲取偽元素(Pseudo-Element)屬性的方法技巧
這篇文章主要介紹了JavaScript獲取偽元素(Pseudo-Element)屬性的方法技巧,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03
前端使用crypto.js進(jìn)行加密的函數(shù)代碼
最近在使用Cookies加密保存數(shù)據(jù)的時(shí)候,接觸到crypto,使用還算簡(jiǎn)單,在這里記錄一下2020-08-08
js實(shí)現(xiàn)分享到隨頁(yè)面滾動(dòng)而滑動(dòng)效果的方法
這篇文章主要介紹了js實(shí)現(xiàn)分享到隨頁(yè)面滾動(dòng)而滑動(dòng)效果的方法,實(shí)例分析了javascript操作頁(yè)面元素滾動(dòng)效果的方法,需要的朋友可以參考下2015-04-04
使用iframe實(shí)現(xiàn)pdf文件預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了如何使用iframe實(shí)現(xiàn)pdf文件預(yù)覽功能,以及iframe預(yù)覽報(bào)錯(cuò)問題和iframe未能加載PDF文檔,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09

