淺析Object.prototype.toString()

一直很奇怪爲何能夠經過Object.prototype.toString()判斷各數據的類型,帶着這個疑問,查看了一些資料。數組

1.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]

2.Object.prototype.toString()與Object.toString()的區別

  • Object.toString()是Object構造函數上的方法,返回的是對應的函數
  • Object.prototype.toString()是Object原型對象上的方法,返回的是表明該對象的字符串函數

    var obj = {};
    Object.toString(obj);//"function Object() { [native code] }"
    Object.prototype.toString.call(obj);//"[object Object]"

3.爲何Array、String、Number、Boolean等不能直接調用toString()?

由於Array、String、Number、Boolean、RegExp、Date等類型都重寫了toString(),若是直接調用則由於自身的原型對象上已有toString()方法,就不會調用到Object原型對象上的toString()方法了。
  1. Array類型ui

    //toString()返回數組中的 數值的字符串表達
    var arr = ["cherry","rose"];
    arr.toString();//"cherry,rose"
  2. String類型this

    //toString()返回字符串的字面量表示
    var str = "my name is cherry"
    str.toString();//"my name is cherry"
  3. Number類型prototype

    //toString()返回 對應數值的字符串表達
    var num = 18;
    num.toString();//"18"
  4. Boolean類型code

    //toString()返回布爾值的字符串表達
    var bool = true;
    bool.toString();//"true";
  5. RegExp類型對象

    var patten = new RegExp("\\abc\\d",'gi');
    patten.toString();//"/\abc/\d/gi"
  6. 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()去判斷類型
相關文章
相關標籤/搜索