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 `${
数据类型}`]})