對於某些情況,依賴於instanceof
運算符是not good enough。
一個已知的問題是它不能在跨幀環境中工作。
的typeof
操作者不那麼有用,並有一些實現錯誤,例如像在Chrome或Firefox 2.x的,其中RegExp
對象被檢測爲"function"
,因爲他們作可調用(例如/foo/(str);
)。
的constructor
財產可以篡改,你應該永遠把倍受信賴它。
最後,Function.prototype.toString
方法是實現相關,這意味着實施可能不包括即使在函數的字符串表示的函數名稱...
一些days ago我是建立一個簡單的但功能強大的類型檢測函數,它使用typeof
作爲原始值,並依賴於[[Class]]
內部屬性的對象。
所有對象都具有這個屬性,實現在內部使用,以檢測對象的樣,它是完全不變,並且只能通過Object.prototype.toString
方法訪問:
用法:
//...
if (typeString(obj) == 'array') {
//..
}
實現:
function typeString(o) {
if (typeof o != 'object')
return typeof o;
if (o === null)
return "null";
//object, array, function, date, regexp, string, number, boolean, error
var internalClass = Object.prototype.toString.call(o)
.match(/\[object\s(\w+)\]/)[1];
return internalClass.toLowerCase();
}
該函數的second variant更爲嚴格,因爲它僅返回ECMAScript規範中描述的內置對象類型。
可能輸出值:
原語:
"number"
"string"
"boolean"
"undefined"
"null"
"object"
內置對象類型(通過[[Class]]
)
"function"
"array"
"date"
"regexp"
"error"
來源
2010-05-05 18:27:18
CMS
你贏得你的74K的聲譽,CMS。 – 2010-05-05 18:37:08
好東西。謝謝!你能否詳細說明爲什麼使用'constructor'屬性不是一個好主意,因爲它可以被「篡改」? – FK82 2010-05-05 19:10:46
@Diobeus,thanks !, @ FK82我的意思是'constructor'屬性是可寫的,而且格式錯誤的對象會給你提供錯誤的結果。 ('var re =/foo /; re.constructor = null;'),你也可以在自定義類型上實現繼承時設置錯誤的'constructor' [甚至沒有注意到](http://joost.zeekat.nl/constructors -considered-mildly-confusing.html)... – CMS 2010-05-05 20:07:11