對於原始型別,除了 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...