JavaScript型別檢測

2021-09-02 14:07:21 字數 1810 閱讀 7051

相信很多同學還跟我曾經以為的一樣,typeof操作符只是判斷物件型別上不太靠譜,它還是可以用來檢測原始值型別的,比如數字、字串、布林型。但看了下面的例子你就不這麼認為了。

typeof 'foo'                 //  'string'

typeof new string('foo') // 'object'

typeof 2 // 'number'

typeof new number(2) // 'object'

typeof true // 'boolean'

typeof new boolean(true) // 'object'

都是同樣的值,如果用建構函式來建立原始值那麼用typeof檢測的結果就都是』object』!這顯然不是我們想要的結果。

那有人說了,typeof淪陷了,我們還有instanceof啊,可是別忘了 instanceof本質上是檢測引用型別的原型鏈的,所以對原始值就根本沒有作用。例如:

'foo' instanceof string     // false

'foo' instanceof object // false

new string('foo') instanceof string //true

new string('foo') instanceof object //true

到了吧,還是不靠譜。

好吧,讓instanceof做不屬於它的工作是對它不太公平啦!那讓它檢測引用型別呢?其實它檢測引用型別也有乙個嚴重的限制: 不能跨幀使用。

假設乙個瀏覽器幀a(frame a)裡的乙個物件被傳入到幀b(frame b)中,兩個幀中都定義了person建構函式,如果來自幀a 的物件是幀a 中person的例項,則有:

persona instanceof frameaperson   //true

persona instanceof framebperson //false

因為每個幀都有person的拷貝,它被認為是該幀中的person的拷貝例項,儘管兩個定義是一樣的。

同樣的問題也出現在其他兩個非常重要的內建型別中:陣列和函式,所以檢測這兩個內建型別一般不用instanceof。

而且instanceof對於物件的整個原型鏈都能檢測到,例如:

var now = new date();

now instanceof date; //true

now instanceof object; //true

因此,用instanceof檢測某一物件是否屬於特定型別並非最佳。

typof和instanceof已經都被否決了,那麼最靠譜的檢測方法是什麼呢?

對於js的內部型別如number, string, boolean, array, function, object, regexp, date, error, math, json可以呼叫object的內部方法tostring, 它可以返回一下格式的資訊:』[object 『+ type + 『]』,例如:

object.prototype.tostring.call('foo') === '[object string]';  //true

object.prototype.tostring.call([1,2,3]) === '[object array]'; //true

用這個方法判斷以上給出的型別,不管任何瀏覽器都會返回一樣的格式,而且滿足跨幀要求。

javascript 型別檢測

1 檢測字串 數值 布林值 undefined function 使用typeof 在safari和chrome中檢測正則也會返回 function 2 檢測null 應用 3 檢測其它物件 方法一 利用instanceof constructor 再某些ie版本中存在跨iframe問題,每個ifr...

JavaScript型別檢測

型別檢測方法如下 typeof,instanceof,object.prototype.tostring,constructor,duck type.1.部分示例如下 typeof 100 number typeof true boolean typeof function function typ...

JavaScript檢測型別

es有五種簡單的資料型別 undefined,null,boolean,number和string,還有一種複雜的資料型別object。對乙個值使用typeof操作符可能返回下列某些字串 undefined 如果這個值未定義 boolean 如果這個值是布林值 string 如果這個值是字串 num...