摘要:判斷一個變量的類型通常使用這樣的方式也可以去判斷一個變量的類型,但問題在于不嚴謹。另外,不直接使用方法的原因,還有一個就是對象的方法有可能會被改寫。
判斷一個變量的類型 typeof
通常使用 typeof a; 這樣的方式也可以去判斷一個變量的類型,但問題在于不嚴謹。比如:
typeof null; // object typeof []; // object
但有時候,我們需要的是更‘純粹’的對象,這個時候怎么辦呢?
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]
美中不足的是,無法區(qū)分出自定義對象:
function Person(){}; console.log(Object.prototype.toString.call(new Person)); //[object Object]
但還有 instanceof
new Person() insatnceof Person; // true
為什么這樣可以區(qū)分呢?
因為toStirng方法返回一個變量(包含對象)的字符串表示方式。那既然這樣,為什么不直接使用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 (中國標(biāo)準(zhǔn)時間) console.log(function(){}.toString());//function (){} console.log(null.toString()); //error console.log(undefined.toString()); //error
同樣是檢測變量類型的方法,Object.prototype.toString.call(obj) 與 obj.toStirng 怎么會結(jié)果不一樣呢?
這是因為toString方法是Objectde 原型方法,而 Array, function等類型作為Object的實例(Function是Object的子類,function又是Function的實例),都繼承并重寫了toString方法,不同的對象類型的對象調(diào)用toStirng方法時,其實調(diào)用的是重回寫之后的toString方法,而不再去調(diào)用Object原型上的toString方法了。
我們可以驗證一下,將數(shù)組的toString方法刪除,看看會是什么結(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操作符可以刪除實例屬性 console.log(Array.prototype.hasOwnProperty("toString")); //false console.log(arr.toString()); //"[object Array]"
刪除了Array的toString方法后,同樣再采用arr.toString()方法調(diào)用時,不再有屏蔽Object原型方法的實例方法,因此沿著原型鏈,arr最后調(diào)用了Object的toString方法,返回了和Object.prototype.toString.call(arr)相同的結(jié)果。
另外,不直接使用obj.toString方法的原因,還有一個就是obj對象的toString方法有可能會被改寫。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89225.html
摘要:控制對象狀態(tài)的方法防止對象擴展。判斷一個對象是否被凍結(jié)。返回當(dāng)前對象對應(yīng)的值。方法的作用是返回一個對象的字符串形式上面代碼表示,對于一個對象調(diào)用方法,會返回字符串用途通過自定義方法,可以讓對象在自動類型轉(zhuǎn)換時,得到想要的字符串形式。 概述Object()Object 構(gòu)造函數(shù)Object 的靜態(tài)方法「本身的方法Object.keys(),Object.getOwnPropertyNam...
摘要:對象類型常見的有,,,正則新增自己提供的樂行判斷如果不對對象做嚴格區(qū)分使用。的實現(xiàn)使用了原型繼承的表示左表達式,表示右表達式,它是用是否等于來判斷對象的類型的。常見框架和庫的實數(shù)據(jù)類型判斷測試這里將的實現(xiàn)原理抽取出來,用原生實現(xiàn)。 JavaScript一共有六種數(shù)據(jù)類型,分為原始類型(又名基本類型)和對象類型(又名引用類型) 原始類型有五種,分別為number,string,boole...
摘要:那么也一并被刪除了。然后我們基本就沒法寫代碼了不存在,因為沒有定義過啊的意義就是把共有屬性預(yù)先定義好,給之后的對象用。 本文為饑人谷講師方方原創(chuàng)文章。 showImg(https://segmentfault.com/img/remote/1460000013249596?w=720&h=504); 你的 JS 代碼還沒運行的時候,JS 環(huán)境里已經(jīng)有一個 window 對象了 win...
摘要:的作用相當(dāng)于,將其轉(zhuǎn)換為布爾值。用于判斷一個變量是否某個對象的實例,如返回同時也會返回返回布爾值,如果為,則返回,否則返回的結(jié)果。 underscore.js源碼 Underscore.js 沒有對原生 JavaScript 對象進行擴展,而是通過調(diào)用 _() 方法進行封裝,一旦封裝完成,原生 JavaScript 對象便成為一個 Underscore 對象。 判斷給定變量是否是對象 ...
摘要:說明中的函數(shù)用于判斷指定參數(shù)是否是一個純粹的對象,返回值為類型。使用語法參數(shù)說明任意類型需要進行判斷的任意值。函數(shù)的方法會返回一個表示函數(shù)源代碼的字符串。具體來說,包括關(guān)鍵字,形參列表,大括號,以及函數(shù)體中的內(nèi)容。 說明 jQuery中的isPlainObject() 函數(shù)用于判斷指定參數(shù)是否是一個純粹的對象,返回值為Boolean類型。 純粹的對象,就是通過 { }、new Obje...
閱讀 2571·2021-11-22 09:34
閱讀 932·2021-11-19 11:34
閱讀 2801·2021-10-14 09:42
閱讀 1472·2021-09-22 15:27
閱讀 2385·2021-09-07 09:59
閱讀 1731·2021-08-27 13:13
閱讀 3432·2019-08-30 11:21
閱讀 771·2019-08-29 18:35