看下測(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.toString和Object.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