相信很多同學還跟我曾經以為的一樣,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...