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

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

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

一、typeof

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

1.1 規(guī)則

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

類型結(jié)果
Boolean"boolean"
String"string"
Number"number"
BigInt"bigint"
Symbol"symbol"
Undefined"undefined"
Null"object"
Function (在 class 也是函數(shù))"function"
其他任何對(duì)象"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 誕生以來(lái)便如此
typeof null === "object";
  • JStypeof null 的結(jié)果為 "object", 這是從 JS 的第一版遺留至今的一個(gè) bug
  • JS 最初的實(shí)現(xiàn)中, JS 中的值是由一個(gè)表示類型的 標(biāo)簽實(shí)際數(shù)據(jù)值 表示的, 對(duì)象的 類型標(biāo)簽0, 由于 null 代表的是空指針, 在大多數(shù)平臺(tái)下值表示為 0x00, 因此, null類型標(biāo)簽0, 因此 typeof null 也就返回了 object
  • 當(dāng)然針對(duì)這個(gè) BUG 曾有一個(gè) ECMAScript 的修復(fù)提案, 但是被拒絕了, 原因是遺留代碼太多了, 如果修改的話影響太廣, 不如繼續(xù)將錯(cuò)就錯(cuò)當(dāng)個(gè)和事老

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

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

function 實(shí)際上是 object 的一個(gè) 子類型, 更深點(diǎn)說(shuō), 函數(shù)是一個(gè)可以被調(diào)用的對(duì)象; 那么它為什么能夠被調(diào)用呢? 那是因?yàn)槠鋬?nèi)部實(shí)現(xiàn)了 [[Call]] 方法, 當(dāng)函數(shù)對(duì)象被調(diào)用時(shí)會(huì)執(zhí)行內(nèi)部方法 [[call]]

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

  • 一個(gè)對(duì)象如果沒(méi)有實(shí)現(xiàn) [[Call]] 內(nèi)部方法, 那么它就返回 object
  • 一個(gè)對(duì)象如果實(shí)現(xiàn)了 [[Call]] 內(nèi)部方法, 那么它就返回 function

1.4 注意事項(xiàng)

  • 所有使用 構(gòu)造函數(shù) 創(chuàng)建的數(shù)據(jù), typeof 都會(huì)返回 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)先級(jí)高于 加法 (+) 等 二進(jìn)制操作符, 因此, 必要時(shí)候記得用括號(hào)
// 括號(hào)有無(wú)將決定表達(dá)式的類型。
const someData = 99;
typeof someData + " Wisen"; // "number Wisen"
typeof (someData + " Wisen"); // "string"

二、instanceof & isPrototypeOf()

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

2.1 instanceof

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

  • 語(yǔ)法: 實(shí)例對(duì)象 instanceof 構(gòu)造函數(shù), 返回一個(gè) 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() 方法用于檢查一個(gè) 對(duì)象 是否存在于 另一個(gè)對(duì)象 的原型鏈中

  • 語(yǔ)法: 原型.isPrototypeOf(實(shí)例), 返回一個(gè)布爾值

  • 示例:

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

三、根據(jù)「constructor」進(jìn)行判斷

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

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

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

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

不同于 instanceof, 不能判斷 對(duì)象父類

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 沒(méi)有 constructor, 所以它是無(wú)法檢測(cè) Null undefined

四、Object.prototype.toString.call()

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

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]

注意: 對(duì)于自定義構(gòu)造函數(shù)實(shí)例化出來(lái)的對(duì)象, 返回的是 [object Object]

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

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

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

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

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

五、總結(jié)

判斷方法基本類型引用類型父類nullundefined
typeof?????
instanceof & isPrototypeOf()?????
constructor?????
Object.prototype.toString.call()?????
標(biāo)題
  • typeof 適合用于判斷 基本類型, 特別的是: Null 會(huì)返回 object、 Function 返回 function、其余 引用類型 都返回 object
  • instanceof & isPrototypeOf() 可以用于判斷引用數(shù)據(jù)的類型, 同時(shí)可判斷 對(duì)象父類
  • constructor 可用于基本類型、引用類型, 但是不可判斷 nullundefined, 并且無(wú)法判斷 對(duì)象父類
  • Object.prototype.toString.call() 萬(wàn)能方法, 對(duì)于 JS 中所有類型都能夠識(shí)別出來(lái), 唯一不足的可能是無(wú)法判斷 對(duì)象父類(但是問(wèn)題不大)

以上就是JavaScript中常見的數(shù)據(jù)類型判斷方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 判斷方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論