常常能碰到Object.prototype.toString.call對參數類型進行判斷,一開始只知道怎麼使用,卻不瞭解具體實現的原理,最近惡補了一下相關知識,寫個筆記增強理解,有什麼不對的請指教。
首先看一下針對不一樣類型的參數獲得的結果,加上瀏覽器都兼容,因此,這也成爲常常用於參數類型判斷的作法瀏覽器
Object.prototype.toString.call([]) //"[object Array]" Object.prototype.toString.call({}) //"[object Object]" Object.prototype.toString.call("") //"[object String]" Object.prototype.toString.call(null) //"[object Null]" Object.prototype.toString.call(undefined) //"[object Undefined]" Object.prototype.toString.call(0) //"[object Number]" Object.prototype.toString.call(true) //"[object Boolean]"
這裏主要兩個難點,Object.prototype.toString()和call()
關於toString(), 能夠查看一下es5文檔規範對Object.prototype.toString()的定義,可查看es5文檔
函數
簡單來講就是Object.prototype.toString()會返回[object, [[class]]]的字符串,其中,[[class]]是es定義的類型,包含"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", 和 "String";再加上es5新增長的返回[object Undefined]和[object Null]
至於Object.prototype.toString.call(arg)則表示給予arg賦予並執行Object的toString方法,因爲Object.prototype.toString()自己容許被修改的,就相似Array、Boolean、Number中的toString()就重寫過,所以須要直接調用Object.prototype.toString.call(arg)來判斷arg的類型this
var arr = [1,2,3]; var obj = {a:'a'}; var num = 3; var str = 'string'; var bool = true; arr.toString(); // "1,2,3" obj.toString(); // "[object Object]" 未修改的Object.prototype.toString(),才能夠用於類型判斷 num.toString(); // "3" str.toString(); // "string" bool.toString(); // "true"
關於call(),格式爲Function.prototype.call(thisArg [,arg1 [,arg2, … ]])
call方法能夠用來代替另外一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變爲由 thisObj指定的新對象。第一句是指借用別人的函數,第二句是指借用別人的上下文環境。es5
function A(){ this.name = "a"; } function B(){ this.name = "b"; } A.prototype.showName = function(){ console.log('this is function a and showName value: '+this.name); } A.prototype.showName.call(B); // this is function a and showName value: B //B 執行了A中的showName
Object.prototype.toString.call(arg)就很容易理解了,arg執行了Object的toString方法,這樣也就很容易理清不一樣參數的返回結果了。prototype