成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Object.prototype.toString.call(obj) 與 obj.toStrin

bang590 / 1448人閱讀

摘要:判斷一個(gè)變量的類型通常使用這樣的方式也可以去判斷一個(gè)變量的類型,但問(wèn)題在于不嚴(yán)謹(jǐn)。另外,不直接使用方法的原因,還有一個(gè)就是對(duì)象的方法有可能會(huì)被改寫。

判斷一個(gè)變量的類型 typeof

通常使用 typeof a; 這樣的方式也可以去判斷一個(gè)變量的類型,但問(wèn)題在于不嚴(yán)謹(jǐn)。比如:

typeof null;   // object
typeof [];     // object

但有時(shí)候,我們需要的是更‘純粹’的對(duì)象,這個(gè)時(shí)候怎么辦呢?

Object.prototype.toString.call(obj)

使用如標(biāo)題那樣的方式可以更好的區(qū)分各種變量的類型:

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));     //[object Number]
console.log(Object.prototype.toString.call(true));   //[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));   //[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));    //[object Function]
console.log(Object.prototype.toString.call([]));        //[object Array]
console.log(Object.prototype.toString.call(new Date));        //[object Date]
console.log(Object.prototype.toString.call(/d/));        //[object RegExp]

美中不足的是,無(wú)法區(qū)分出自定義對(duì)象:

function Person(){};
console.log(Object.prototype.toString.call(new Person));    //[object Object]

但還有 instanceof

new Person()  insatnceof Person;   // true

為什么這樣可以區(qū)分呢?
因?yàn)閠oStirng方法返回一個(gè)變量(包含對(duì)象)的字符串表示方式。那既然這樣,為什么不直接使用obj.toString呢 ?

obj.toString
console.log("jerry".toString());    //jerry
console.log((1).toString());        //1
console.log([1,2].toString());      //1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
console.log(function(){}.toString());//function (){}
console.log(null.toString());        //error
console.log(undefined.toString());   //error

同樣是檢測(cè)變量類型的方法,Object.prototype.toString.call(obj) 與 obj.toStirng 怎么會(huì)結(jié)果不一樣呢?

這是因?yàn)閠oString方法是Objectde 原型方法,而 Array, function等類型作為Object的實(shí)例(Function是Object的子類,function又是Function的實(shí)例),都繼承并重寫了toString方法,不同的對(duì)象類型的對(duì)象調(diào)用toStirng方法時(shí),其實(shí)調(diào)用的是重回寫之后的toString方法,而不再去調(diào)用Object原型上的toString方法了。

我們可以驗(yàn)證一下,將數(shù)組的toString方法刪除,看看會(huì)是什么結(jié)果:

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));    //true
console.log(arr.toString());    //1,2,3
delete Array.prototype.toString;    //delete操作符可以刪除實(shí)例屬性
console.log(Array.prototype.hasOwnProperty("toString"));    //false
console.log(arr.toString());    //"[object Array]"

刪除了Array的toString方法后,同樣再采用arr.toString()方法調(diào)用時(shí),不再有屏蔽Object原型方法的實(shí)例方法,因此沿著原型鏈,arr最后調(diào)用了Object的toString方法,返回了和Object.prototype.toString.call(arr)相同的結(jié)果。

另外,不直接使用obj.toString方法的原因,還有一個(gè)就是obj對(duì)象的toString方法有可能會(huì)被改寫。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89225.html

相關(guān)文章

  • 標(biāo)準(zhǔn)庫(kù)(一)object對(duì)象

    摘要:控制對(duì)象狀態(tài)的方法防止對(duì)象擴(kuò)展。判斷一個(gè)對(duì)象是否被凍結(jié)。返回當(dāng)前對(duì)象對(duì)應(yīng)的值。方法的作用是返回一個(gè)對(duì)象的字符串形式上面代碼表示,對(duì)于一個(gè)對(duì)象調(diào)用方法,會(huì)返回字符串用途通過(guò)自定義方法,可以讓對(duì)象在自動(dòng)類型轉(zhuǎn)換時(shí),得到想要的字符串形式。 概述Object()Object 構(gòu)造函數(shù)Object 的靜態(tài)方法「本身的方法Object.keys(),Object.getOwnPropertyNam...

    Muninn 評(píng)論0 收藏0
  • javascript 數(shù)據(jù)類型判斷 (常見(jiàn)庫(kù)的數(shù)據(jù)類型判斷源碼的分析)

    摘要:對(duì)象類型常見(jiàn)的有,,,正則新增自己提供的樂(lè)行判斷如果不對(duì)對(duì)象做嚴(yán)格區(qū)分使用。的實(shí)現(xiàn)使用了原型繼承的表示左表達(dá)式,表示右表達(dá)式,它是用是否等于來(lái)判斷對(duì)象的類型的。常見(jiàn)框架和庫(kù)的實(shí)數(shù)據(jù)類型判斷測(cè)試這里將的實(shí)現(xiàn)原理抽取出來(lái),用原生實(shí)現(xiàn)。 JavaScript一共有六種數(shù)據(jù)類型,分為原始類型(又名基本類型)和對(duì)象類型(又名引用類型) 原始類型有五種,分別為number,string,boole...

    libin19890520 評(píng)論0 收藏0
  • JS 中 __proto__ 和 prototype 存在的意義是什么?

    摘要:那么也一并被刪除了。然后我們基本就沒(méi)法寫代碼了不存在,因?yàn)闆](méi)有定義過(guò)啊的意義就是把共有屬性預(yù)先定義好,給之后的對(duì)象用。 本文為饑人谷講師方方原創(chuàng)文章。 showImg(https://segmentfault.com/img/remote/1460000013249596?w=720&h=504); 你的 JS 代碼還沒(méi)運(yùn)行的時(shí)候,JS 環(huán)境里已經(jīng)有一個(gè) window 對(duì)象了 win...

    msup 評(píng)論0 收藏0
  • 關(guān)于一些前端js框架的源碼研究

    摘要:的作用相當(dāng)于,將其轉(zhuǎn)換為布爾值。用于判斷一個(gè)變量是否某個(gè)對(duì)象的實(shí)例,如返回同時(shí)也會(huì)返回返回布爾值,如果為,則返回,否則返回的結(jié)果。 underscore.js源碼 Underscore.js 沒(méi)有對(duì)原生 JavaScript 對(duì)象進(jìn)行擴(kuò)展,而是通過(guò)調(diào)用 _() 方法進(jìn)行封裝,一旦封裝完成,原生 JavaScript 對(duì)象便成為一個(gè) Underscore 對(duì)象。 判斷給定變量是否是對(duì)象 ...

    whjin 評(píng)論0 收藏0
  • jQuery中的isPlainObject()方法 實(shí)現(xiàn)原理

    摘要:說(shuō)明中的函數(shù)用于判斷指定參數(shù)是否是一個(gè)純粹的對(duì)象,返回值為類型。使用語(yǔ)法參數(shù)說(shuō)明任意類型需要進(jìn)行判斷的任意值。函數(shù)的方法會(huì)返回一個(gè)表示函數(shù)源代碼的字符串。具體來(lái)說(shuō),包括關(guān)鍵字,形參列表,大括號(hào),以及函數(shù)體中的內(nèi)容。 說(shuō)明 jQuery中的isPlainObject() 函數(shù)用于判斷指定參數(shù)是否是一個(gè)純粹的對(duì)象,返回值為Boolean類型。 純粹的對(duì)象,就是通過(guò) { }、new Obje...

    leon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<