1所禀、typeof
typeof'';// string 有效
typeof1;// number 有效
typeofSymbol();// symbol 有效
typeoftrue;//boolean 有效
typeofundefined;//undefined 有效
typeofnull;//object 無效
typeof[] ;//object 無效
typeofnewFunction();// function 有效
typeofnewDate();//object 無效
typeofnewRegExp();//object 無效
對于基本類型稚机,除 null 以外伦仍,均可以返回正確的結(jié)果。
對于引用類型怖喻,除 function 以外底哗,一律返回 object 類型。
對于 null 锚沸,返回 object 類型跋选。
對于 function 返回 ?function 類型。
2咒吐、instanceof
instanceof 是用來判斷 A 是否為 B 的實例野建,表達式為:A instanceof B属划,如果 A 是 B 的實例,則返回 true,否則返回 false候生。
3同眯、constructor
當一個函數(shù) F被定義時,JS引擎會為F添加 prototype 原型唯鸭,然后再在 prototype上添加一個 constructor 屬性须蜗,并讓其指向 F 的引用。如下所示:
細節(jié)問題:
null 和 undefined 是無效的對象目溉,因此是不會有 constructor 存在的明肮,這兩種類型的數(shù)據(jù)需要通過其他方式來判斷。
函數(shù)的 constructor 是不穩(wěn)定的缭付,這個主要體現(xiàn)在自定義對象上柿估,當開發(fā)者重寫 prototype 后,原有的 constructor 引用會丟失陷猫,constructor 會默認為 Object
因此秫舌,為了規(guī)范開發(fā),在重寫對象原型時一般都需要重新給 constructor 賦值绣檬,以保證對象實例的類型不被篡改足陨。
4、toString
toString 是 Object 原型對象上的方法娇未,使用 call 來調(diào)用該方法會返回調(diào)用者的類型字符串墨缘,格式為 [object,xxx],xxx 是調(diào)用者的數(shù)據(jù)類型零抬,包括:String镊讼、Number、Boolean媚值、Undefined狠毯、Null、Function褥芒、Date嚼松、Array、RegExp锰扶、Error献酗、HTMLDocument 等, 基本上坷牛,所有的數(shù)據(jù)類型都可以通過這個方法獲取到罕偎。
13Object.prototype.toString.call('') ;? // [object String]
Object.prototype.toString.call(1) ;? // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window是全局對象 global 的引用
需要注意的是,必須通過 call 或 apply 來調(diào)用京闰,而不能直接調(diào)用 toString 颜及, 從原型鏈的角度講甩苛,所有對象的原型鏈最終都指向了 Object, 按照JS變量查找規(guī)則俏站,其他對象應(yīng)該也可以直接訪問到 Object 的 toString方法讯蒲,而事實上,大部分的對象都實現(xiàn)了自身的 toString 方法肄扎,這樣就可能會導(dǎo)致 Object 的 toString 被終止查找墨林,因此要用 call/apply 來強制調(diào)用Object 的 toString 方法。