摘要:判斷一個(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呢 ?
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
摘要:控制對(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...
摘要:對(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...
摘要:那么也一并被刪除了。然后我們基本就沒(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...
摘要:的作用相當(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ì)象 ...
摘要:說(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...
閱讀 2587·2021-11-22 09:34
閱讀 962·2021-11-19 11:34
閱讀 2815·2021-10-14 09:42
閱讀 1499·2021-09-22 15:27
閱讀 2399·2021-09-07 09:59
閱讀 1749·2021-08-27 13:13
閱讀 3442·2019-08-30 11:21
閱讀 784·2019-08-29 18:35