看下测试结果:
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)
理解这句话的意思:
调用Object.prototype.toString
方法,使用call
改变this
指向obj
疑问1:本身也有toString()方法,那我们为什么非要用Object上的呢?
让我们来看一下各自的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
由名字可以看出此方法是将传入的数据类型转换成字符串输出(null和undefined除外)
在JavaScript中,所有类都继承于Object
,因此toString()
方法应该也被继承了,但由上述可见事实并不像我们想的那样,其实各数据类型使用toString()
后的结果表现不一的原因在于:所有类在继承Object的时候,创建了自己的toString()方法。
Object.prototype.toString === Array.prototype.toString // false
Object.prototype.toString === Number.prototype.toString // false
Object.prototype.toString === String.prototype.toString // false
// 定义一个数组
var arr = [1, 2, 3]
// 数组原型上是否具有 toString() 方法
console.log(Array.prototype.hasOwnProperty('toString')) // true
// 数组直接使用自身的 toString() 方法
console.log(arr.toString()) // '1,2,3'
// delete操作符删除数组原型上的 toString()
delete Array.prototype.toString
// 删除后,数组原型上是否还具有 toString() 方法
console.log(Array.prototype.hasOwnProperty('toString')) // false
// 删除后的数组再次使用 toString() 时,会向上层访问这个方法,即 Object 的 toString()
console.log(arr.toString()) // '[object Array]'
疑问2:为什么Array.prototype.toString.call({})
返回'[object Object]'
,执行结果和Object.prototype.toString.call(obj)
一样
我们刚刚也说过了各个类都创建了自己的toString
方法,为什么Array.prototype.toString.call({})
返回的是'[object Object]'
扩展:Object.toString
和Object.prototype.toString
其实每个类上还存在一个toString
方法,这个方法是继承与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
网友评论