Object.prototype.toString.call(arg)詳解

常常能碰到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

相關文章
相關標籤/搜索