最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中常見的數(shù)據類型判斷方法小結

 更新時間:2023年06月21日 08:26:11   作者:墨淵君  
在?JS?編程中,正確判斷數(shù)據類型是必備技能,也是面試常問的內,本文將探討四種常用的數(shù)據類型判斷方法,通過了解它們的特點和適用范圍,能夠更好地處理不同數(shù)據類型的情況,避免出現(xiàn)錯誤和提升代碼質量,需要的朋友可以參考下

一、typeof

typeof 運算符返回一個字符串, 表示操作數(shù)的類型, 使用語法: typeof <操作數(shù)>

1.1 規(guī)則

下表, 是 typeof 針對不同數(shù)據類型, 返回的結果值

類型結果
Boolean"boolean"
String"string"
Number"number"
BigInt"bigint"
Symbol"symbol"
Undefined"undefined"
Null"object"
Function (在 class 也是函數(shù))"function"
其他任何對象"object"

示例代碼如下:

console.log(typeof true) // boolean
console.log(typeof '123') // string
console.log(typeof 11111) // number
console.log(typeof Math.LN2) // number
console.log(typeof Infinity) // number
console.log(typeof NaN) // number
console.log(typeof BigInt(11111)) // bigint
console.log(typeof Symbol(1111)) // symbol
console.log(typeof undefined) // undefined
console.log(typeof null) // object
console.log(typeof (() => {})) // function
console.log(typeof class {}) // function
console.log(typeof {}) // object 
console.log(typeof []) // object
console.log(typeof /abc/) // object
console.log(typeof new Date()) // object
console.log(typeof new Promise(() => {})) // object

1.2 為什么「typeof null」等于「object」

// JavaScript 誕生以來便如此
typeof null === "object";
  • JStypeof null 的結果為 "object", 這是從 JS 的第一版遺留至今的一個 bug
  • JS 最初的實現(xiàn)中, JS 中的值是由一個表示類型的 標簽實際數(shù)據值 表示的, 對象的 類型標簽0, 由于 null 代表的是空指針, 在大多數(shù)平臺下值表示為 0x00, 因此, null類型標簽0, 因此 typeof null 也就返回了 object
  • 當然針對這個 BUG 曾有一個 ECMAScript 的修復提案, 但是被拒絕了, 原因是遺留代碼太多了, 如果修改的話影響太廣, 不如繼續(xù)將錯就錯當個和事老

1.3 為什么「typeof (() => {})」等于 「function」

首先我們需要了解一個小知識, 函數(shù)是什么? 為什么被調用?

function 實際上是 object 的一個 子類型, 更深點說, 函數(shù)是一個可以被調用的對象; 那么它為什么能夠被調用呢? 那是因為其內部實現(xiàn)了 [[Call]] 方法, 當函數(shù)對象被調用時會執(zhí)行內部方法 [[call]]

那么回到正題, 為什么 typeof (() => {}) 會返回 function? 這里主要還是要看 ES6typeof 是如何區(qū)分函數(shù)和對象類型的:

  • 一個對象如果沒有實現(xiàn) [[Call]] 內部方法, 那么它就返回 object
  • 一個對象如果實現(xiàn)了 [[Call]] 內部方法, 那么它就返回 function

1.4 注意事項

  • 所有使用 構造函數(shù) 創(chuàng)建的數(shù)據, typeof 都會返回 objectfunction
const str = new String("String");
const num = new Number(100);
typeof str; // "object"
typeof num; // "object"
const func = new Function();
typeof func; // "function"
  • typeof 操作符的優(yōu)先級高于 加法 (+) 等 二進制操作符, 因此, 必要時候記得用括號
// 括號有無將決定表達式的類型。
const someData = 99;
typeof someData + " Wisen"; // "number Wisen"
typeof (someData + " Wisen"); // "string"

二、instanceof & isPrototypeOf()

JS 中我們有 兩種 方式可以判斷 原型 是否存在于某個 實例原型鏈 上, 通過這種判斷就可以幫助我們, 確定 引用數(shù)據 的具體類型; 需要注意的是該方法 只能用于判斷引用數(shù)據, 無法判斷 基本數(shù)據 類型

2.1 instanceof

  • 介紹: instanceof 運算符用于檢測 構造函數(shù)prototype 屬性是否出現(xiàn)在 某個實例 對象的 原型鏈

  • 語法: 實例對象 instanceof 構造函數(shù), 返回一個 Boolean

  • 示例:

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
auto instanceof Car // Car.prototype 是否在 auto 原型鏈上, true
auto instanceof Object // Object.prototype 是否在 auto 原型鏈上, true

2.2 Object.prototype.isPrototypeOf()

  • 介紹: isPrototypeOf() 方法用于檢查一個 對象 是否存在于 另一個對象 的原型鏈中

  • 語法: 原型.isPrototypeOf(實例), 返回一個布爾值

  • 示例:

function Car() {}
const auto = new Car();
Car.prototype.isPrototypeOf(auto) // Car.prototype 是否在 auto 原型鏈上, true
Object.prototype.isPrototypeOf(auto) // Object.prototype 是否在 auto 原型鏈上, true

三、根據「constructor」進行判斷

constructor 判斷方法跟 instanceof 相似, 如下圖是 原型、實例構造函數(shù) 之間的一個關系圖, 從圖可知, 在 實例對象的原型 中存在 constructor 指向 構造函數(shù), 那么借用這個特性我們可以用于判斷 數(shù)據 類型

function Car() {}
const auto = new Car();
auto.constructor === Car // true

不同于 instanceof, 通過該方式既可以處理 引用數(shù)據、又能夠處理 基本數(shù)據

(123).constructor === Number // true
(true).constructor === Boolean // true
('bar').constructor === String // true

不同于 instanceof, 不能判斷 對象父類

class A {}
class B extends A {}
const b = new B()
b.constructor === B // true
b.constructor === A // false
b instanceof B // true
b instanceof A // true

注意: null 和 undefined 沒有 constructor, 所以它是無法檢測 Null undefined

四、Object.prototype.toString.call()

Object.prototype.toString() 方法返回一個表示該對象的字符串, 該字符串格式為 "[object Type]", 這里的 Type 就是對象的類型

const toString = Object.prototype.toString;
toString.call(111); // [object Number]
toString.call(null); // [object Null]
toString.call(undefined); // [object Undefined]
toString.call(Math); // [object Math]
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]

注意: 對于自定義構造函數(shù)實例化出來的對象, 返回的是 [object Object]

const toString = Object.prototype.toString;
function Bar(){}
toString.call(new Bar()); // [object Object]

默認, 如果一個對象有 Symbol.toStringTag 屬性并且該屬性值是個字符串, 那么這個屬性值, 會被用作 Object.prototype.toString() 返回內容的 Type 值進行展示

const toString = Object.prototype.toString;
const obj = {
  [Symbol.toStringTag]: 'Bar'
}
toString.call(obj) // [object Bar]

補充: 一個通用方法, 一行代碼獲取 數(shù)據的類型

const getType = (data) => {
  return Object.prototype.toString.call(someType)
    .slice(8, -1)
    .toLocaleLowerCase()
}

五、總結

判斷方法基本類型引用類型父類nullundefined
typeof?????
instanceof & isPrototypeOf()?????
constructor?????
Object.prototype.toString.call()?????
標題
  • typeof 適合用于判斷 基本類型, 特別的是: Null 會返回 objectFunction 返回 function、其余 引用類型 都返回 object
  • instanceof & isPrototypeOf() 可以用于判斷引用數(shù)據的類型, 同時可判斷 對象父類
  • constructor 可用于基本類型、引用類型, 但是不可判斷 null、undefined, 并且無法判斷 對象父類
  • Object.prototype.toString.call() 萬能方法, 對于 JS 中所有類型都能夠識別出來, 唯一不足的可能是無法判斷 對象父類(但是問題不大)

以上就是JavaScript中常見的數(shù)據類型判斷方法小結的詳細內容,更多關于JavaScript 判斷方法的資料請關注腳本之家其它相關文章!

相關文章

  • JavaScript監(jiān)聽DOM尺寸變化的解決方案

    JavaScript監(jiān)聽DOM尺寸變化的解決方案

    文章分析了傳統(tǒng)resize監(jiān)聽的弊端,如粒度粗糙、性能問題等并提出了多種解決方案,通過插入<object>、監(jiān)聽scroll或使用現(xiàn)代的ResizeObserver API等來實現(xiàn)了更精準、高效地的元素尺寸監(jiān)聽,文章還討論了這些方法的優(yōu)缺點及適用場景,需要的朋友可以參考下
    2026-05-05
  • js獲取select標簽的值且兼容IE與firefox

    js獲取select標簽的值且兼容IE與firefox

    本篇文章主要介紹了js獲取select標簽的值且兼容IE與firefox。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 微信小程序獲取驗證碼60秒倒計時功能

    微信小程序獲取驗證碼60秒倒計時功能

    這篇文章主要介紹了微信小程序獲取驗證碼60秒倒計時模板,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 分享一些不常見卻很實用的JS技巧

    分享一些不常見卻很實用的JS技巧

    有些代碼,需要的時候能寫的出來,但是也需要時間,如果有的東西長時間不接觸,再次看的時候也會感覺很陌生,這篇文章主要給大家介紹了一些不常見卻很實用的JS技巧,既可以作為一個知識的積累,又可以作為閑暇時打發(fā)時間寫寫代碼的記錄,需要的朋友可以參考下
    2021-11-11
  • JS遍歷對象屬性的方法示例

    JS遍歷對象屬性的方法示例

    這篇文章主要介紹了JS遍歷對象屬性的方法,涉及JS針對頁面元素屬性遍歷操作的相關技巧,需要的朋友可以參考下
    2017-01-01
  • document.createElement()用法及注意事項(ff下不兼容)

    document.createElement()用法及注意事項(ff下不兼容)

    今天處理了一個日期選擇器的ie和ff的兼容問題,本來這種情況就很難找錯誤,找了好久才把錯誤定位到js中創(chuàng)建元素的方法document.createElement(),這個方法在ie下支持這樣創(chuàng)建元素
    2013-03-03
  • 如何通過Proxy實現(xiàn)JSBridge模塊化封裝

    如何通過Proxy實現(xiàn)JSBridge模塊化封裝

    這篇文章主要介紹了如何通過Proxy實現(xiàn)JSBridge模塊化封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • javascript 高級語法之繼承的基本使用方法示例

    javascript 高級語法之繼承的基本使用方法示例

    這篇文章主要介紹了javascript 高級語法之繼承的基本使用方法,結合實例形式分析了JavaScript繼承的基本使用方法與操作注意事項,需要的朋友可以參考下
    2019-11-11
  • js 與或運算符 || && 妙用

    js 與或運算符 || && 妙用

    js 與或運算符 || && 妙用,可用于精簡代碼,降低程序的可讀性。
    2009-12-12
  • js動態(tài)為代碼著色顯示行號

    js動態(tài)為代碼著色顯示行號

    使用Javascript插件,在瀏覽器客戶端動態(tài)的為代碼著色,可以顯示行號,具體實現(xiàn)代碼如下,感興趣的朋友可以參考下哈
    2013-05-05

最新評論

南通市| 启东市| 石家庄市| 屏南县| 隆子县| 年辖:市辖区| 广饶县| 弥渡县| 金塔县| 庆城县| 乌审旗| 雷波县| 河北省| 衡水市| 普宁市| 金坛市| 汝州市| 柳林县| 彭泽县| 宁波市| 永川市| 南华县| 麻栗坡县| 山丹县| 丽江市| 弥勒县| 婺源县| 富顺县| 逊克县| 绿春县| 庐江县| 保亭| 玉山县| 布拖县| 保亭| 屯门区| 宝兴县| 武邑县| 驻马店市| 黔江区| 伊金霍洛旗|