Object.prototype.toString.call(obj),此方法為什么能檢測(cè)數(shù)據(jù)類型

看下測(cè)試結(jié)果:

console.log(Object.prototype.toString.call('Mica')); // [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: 'Mica' })); // [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]

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

首先我們先Object.prototype.toString.call(obj)理解這句話的意思:

調(diào)用Object.prototype.toString方法,使用call改變this指向obj

疑問1:本身也有toString()方法,那我們?yōu)槭裁捶且肙bject上的呢?

讓我們來看一下各自的toString()方法:

var num = 123
num.toString() // '123'

var str = 'hello'
str.toString() // 'hello'

var bool = false
bool.toString() // 'false'

var arr = [1, 2, 3]
arr.toString()  // '1,2,3'

var obj = { lang:'zh' }
obj.toString()  // '[object Object]'

var fn = function(){}
fn.toString()  // 'function(){}'

null.toString()  // Cannot read property 'toString' of null

undefined.toString() // Cannot read property 'toString' of undefined

toString由名字可以看出此方法是將傳入的數(shù)據(jù)類型轉(zhuǎn)換成字符串輸出(null和undefined除外)

在JavaScript中,所有類都繼承于Object,因此toString()方法應(yīng)該也被繼承了,但由上述可見事實(shí)并不像我們想的那樣,其實(shí)各數(shù)據(jù)類型使用toString()后的結(jié)果表現(xiàn)不一的原因在于:所有類在繼承Object的時(shí)候,創(chuàng)建了自己的toString()方法。

Object.prototype.toString === Array.prototype.toString // false
Object.prototype.toString === Number.prototype.toString // false
Object.prototype.toString === String.prototype.toString // false
// 定義一個(gè)數(shù)組
var arr = [1, 2, 3]
// 數(shù)組原型上是否具有 toString() 方法
console.log(Array.prototype.hasOwnProperty('toString')) // true

// 數(shù)組直接使用自身的 toString() 方法
console.log(arr.toString()) // '1,2,3'

// delete操作符刪除數(shù)組原型上的 toString()
delete Array.prototype.toString

// 刪除后,數(shù)組原型上是否還具有 toString() 方法
console.log(Array.prototype.hasOwnProperty('toString')) // false

// 刪除后的數(shù)組再次使用 toString() 時(shí),會(huì)向上層訪問這個(gè)方法,即 Object 的 toString()
console.log(arr.toString()) // '[object Array]'

疑問2:為什么Array.prototype.toString.call({})返回'[object Object]',執(zhí)行結(jié)果和Object.prototype.toString.call(obj)一樣

我們剛剛也說過了各個(gè)類都創(chuàng)建了自己的toString方法,為什么Array.prototype.toString.call({})返回的是'[object Object]'

擴(kuò)展:Object.toStringObject.prototype.toString

其實(shí)每個(gè)類上還存在一個(gè)toString方法,這個(gè)方法是繼承與Function.prototype.toString

Array.toString === Function.prototype.toString // true
Array.toString === Object.toString // true
Array.toString === String.toString // true

https://blog.csdn.net/qq_38722097/article/details/88046377
https://juejin.cn/post/7007416743215759373
https://zhuanlan.zhihu.com/p/118793721

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容