一直很奇怪爲何能夠經過Object.prototype.toString()判斷各數據的類型,帶着這個疑問,查看了一些資料。數組
那麼當咱們調用這個方法時,具體會作那些操做呢? 1.若是this value是undefined,返回 "[object Undefined]" 2.若是this value是null,返回"[object Null]" 3.讓O做爲ToOject(this value)方法的返回值 4.讓isArray做爲IsArray(O)方法的返回值 5.若是isArray爲true,使builtinTag爲"Array" 6.else 若是O包含[[ParameterMap]]internal slot,使builtinTag爲"Arguments" 7.else 若是O包含[[Call]]internal method,使builtinTag爲"Function" 8.else 若是O包含[[ErrorData]]internal slot,使builtinTag爲"Error" 9.else 若是O包含[[BooleanData]]internal slot,使builtinTag爲"Boolean" 10.else 若是O包含[[NumberData]]internal slot,使builtinTag爲"Number" 11.else 若是O包含[[StringData]]internal slot,使builtinTag爲"String" 12.else 若是O包含[[DateValue]]internal slot,使builtinTag爲"Date" 13.else 若是O包含[[RegExpMatcher]]internal slot,使builtinTag爲"RegExp" 14.else 使builtinTag爲"Object" 15.讓tag做爲Get(O,@@toStringTag)的返回值 16.若是Type(tag)不是String,使tag爲builtinTag的值 17.返回由"[object ",tag,"]"這三個字符串拼接的字符串 具體的解釋可見[ECMAScript官方文檔][1]
Object.prototype.toString()是Object原型對象上的方法,返回的是表明該對象的字符串函數
var obj = {}; Object.toString(obj);//"function Object() { [native code] }" Object.prototype.toString.call(obj);//"[object Object]"
由於Array、String、Number、Boolean、RegExp、Date等類型都重寫了toString(),若是直接調用則由於自身的原型對象上已有toString()方法,就不會調用到Object原型對象上的toString()方法了。
Array類型ui
//toString()返回數組中的 數值的字符串表達 var arr = ["cherry","rose"]; arr.toString();//"cherry,rose"
String類型this
//toString()返回字符串的字面量表示 var str = "my name is cherry" str.toString();//"my name is cherry"
Number類型prototype
//toString()返回 對應數值的字符串表達 var num = 18; num.toString();//"18"
Boolean類型code
//toString()返回布爾值的字符串表達 var bool = true; bool.toString();//"true";
RegExp類型對象
var patten = new RegExp("\\abc\\d",'gi'); patten.toString();//"/\abc/\d/gi"
Date類型ip
//toString() 返回當前時間的標準時間字符串表達 var date = new Date(2019/07/07); date.toString();//"Thu Jan 01 1970 08:00:00 GMT+0800 (中國標準時間)
1. 首先須要瞭解Object.prototype.toString()的原理和各值返回的字符串。 2. Object.prototype.toString()與Object.toString()是兩個不一樣的方法,他們返回的值是不同的。前者返回的是該對象類型的字符串,後者返回的是一個函數代碼 3.爲何數組、布爾等不直接調用toString(),由於它們本身的原型對象上重寫了toString()表明各自不一樣的邏輯。須要調用Ojbect原型對象上的toString()去判斷類型