JS之資料型別檢測

2021-09-28 18:46:29 字數 3928 閱讀 6705

對於原始型別,除了 null 都可以呼叫typeof顯示正確的型別。

typeof

1// 'number'

typeof

'1'// 'string'

typeof undefined // 'undefined'

typeof

true

// 'boolean'

typeof

symbol()

// 'symbol'

對於引用資料型別,除了函式之外,都會顯示"object"。

typeof

// 'object'

typeof

null

// object

typeof console.log // 'function'

注意null不是物件雖然typeof null會輸出 object,但是這只是 js 存在的乙個悠久 bug。在 js 的最初版本中使用的是 32 位系統,為了效能考慮使用低位儲存變數的型別資訊,000 開頭代表是物件然而 null 表示為全零,所以將它錯誤的判斷為 object 。

採用typeof判斷物件資料型別是不合適的,採用instanceof會更好,instanceof的原理是基於原型鏈的查詢,只要處於原型鏈中,判斷永遠為true。

const

person

=function()

const p1 =

newperson()

p1 instanceof

person

// true

var str1 =

'hello world'

str1 instanceof

string

// false

var str2 =

newstring

('hello world'

)str2 instanceof

string

// true

var a=

null

a instanceof

object

// false

js原型鏈與instanceof底層原理:

instanceof能否判斷基本資料型別?

能。比如下面這種方式:

class

primitivenumber

}console.

log(

111instanceof

primitivenumber

)// true

如果你不知道symbol,可以看看mdn上關於hasinstance的解釋。

其實就是自定義instanceof行為的一種方式,這裡將原有的instanceof方法重定義,換成了typeof,因此能夠判斷基本資料型別。

核心: 原型鏈的向上查詢。

function

myinstanceof

(left, right)

}

測試:

console.

log(

myinstanceof

("111"

, string));

//false

console.

log(

myinstanceof

(new

string

("111"

), string));

//true

語法:object.is(value1, value2)

如果下列任何一項成立,則兩個值相同:

這種相等性判斷邏輯和傳統的==運算不同,==運算子會對它兩邊的運算元做隱式型別轉換(如果它們型別不同),然後才進行相等性比較,(所以才會有類似 「」 == false 等於 true 的現象),但 object.is 不會做這種型別轉換。

這與===運算子的判定方式也不一樣。===運算子(和== 運算子)將數字值 -0 和 +0 視為相等,並認為 number.nan 不等於 nan。

object.is(

'foo'

,'foo');

// true

object.

is(window, window)

;// true

object.is(

'foo'

,'bar');

// false

object.is(

,[])

;// false

object.is(

nan,

nan)

;//true

var foo =

;var bar =

;object.

is(foo, foo)

;// true

object.

is(foo, bar)

;// false

object.is(

null

,null);

// true

// 特例

object.is(

0,-0

);// false

object.is(

0,+0

);// true

object.is(

-0,-

0);// true

object.is(

nan,0/

0);// true

其原始碼如下:

function

is(x, y)

else

}

雙等號==:

(1)如果兩個值型別相同,再進行三個等號(===)的比較

(2)如果兩個值型別不同,也有可能相等,需根據以下規則進行型別轉換再比較:

引數型別1

引數型別2

強制轉換

null

undefined

不轉換,總是返回true

null或undefined

其它任何非null或undefined的型別

不轉換,總是返回false

原始型別:string、number或boolean

date物件

將原始型別轉換成數字;將date物件轉換為原始型別。(優先嘗試tostring方法,再嘗試valueof方法)

原始型別:string、number或boolean

非data物件

將原始型別轉換成數字;將非date物件轉換為原始型別。(優先嘗試tostring方法,再嘗試valueof方法)

原始型別:string、number或boolean

原始型別:string、number或boolean

將原始型別轉換成數字

原始型別:string、number或boolean

object

將object轉換成字串;將原始型別轉換成數字

三等號===:

(1)如果型別不同,就一定不相等

(2)如果兩個都是數值,並且是同乙個值,那麼相等;如果其中至少乙個是nan,那麼不相等。(判斷乙個值是否是nan,只能使用isnan( ) 來判斷)

(3)如果兩個都是字串,每個位置的字元都一樣,那麼相等,否則不相等。

(4)如果兩個值都是true,或是false,那麼相等

(5)如果兩個值都引用同乙個物件或是函式,那麼相等,否則不相等

(6)如果兩個值都是null,或是undefined,那麼相等

博文參考:

js檢測資料型別

要檢測乙個變數是不是基本資料型別?typeof 操作符是最佳的工具。說得更具體一 點,typeof 操作符是確定乙個變數是字串 數值 布林值,還是undefined 的最佳工具。如果變 量的值是乙個物件或null,則typeof 操作符會像下面例子中所示的那樣返回 object var s nich...

JS資料型別檢測

在js的日常使用中,經常需要檢測資料的型別,現在,就來看一下,js有哪些方法可以檢測資料的型別。typeof操作符返回乙個字串,表示未經計算的運算元的型別。typeof是js原生提供用來檢測型別的api,然而,並沒有什麼用。為什麼呢?因為,typeof不能準確地檢測出我們所想要知道的資料的型別。ty...

JS 資料型別檢測

tpeof val 用來檢測資料型別的運算子。基於typeof檢測出來的結果 首先是乙個字串 字串中是對應的型別 侷限性 typeof null object 但是null並不是物件 基於typeof 無法細分出當前值是普通物件還是陣列物件等,只要是物件型別,返回結果都是 object typeof...