[js] Über data.toString() und Object.prototype.toString.call()

data.toString()

// 假设data是个数组
[1, 2, 3].toString()		// 得到结果:'1, 2, 3'

// 假设data是个对象
{
    
     data: 123 }.toString()	// 得到结果: [Object Object]

这是因为Array和Object的prototype里面都有toString,Object.toString()是判断数据类型信息;而Array.toString()是转换成stringl类型,返回一个以逗号分隔的字符串

console.log(Array.prototype.hasOwnProperty('toString'))	// true

如果去掉Array的prototype上面的toString,Array就去寻找Object的toString并继承,这是原型链,此时再arr.toString()就不是表示把Array转成string类型,而是判断数据类型

// 假设此时已经执行了删除Array上的toString方法的操作,Array上已经不存在toString了
Array.prototype.toString([1, 2, 3])		// [Object Object]

但是有个问题,为什么输出的是[Object Object],而不是[object Array],明明我传入的是一个数组。那是因为Object.prototype本身是对象类型,所以返回对象,如果要输出传入的数据的类型,就要使用call改变传入值的this指向,让传入值指向Object.prototype

Object.prototype.toString.call([1, 2, 3])		// [object Array]

一般用typeof判断数据类型,但是typeof不能判断Object Array null,如果要判断Object和Array,可以用Array.isArray、instanceOf,但是用Object.prototype.toString.call可以判断所以类型,比如:

console.log(Object.prototype.tpString.call(数据) === [object `${
      
      数据类型}`]})

Guess you like

Origin blog.csdn.net/bbt953/article/details/132476517