JavaScript 作为弱类型语言, 它的数据类型从来都是个令码农头疼的问题
比如用 typeof _var 获取数据类型, 简直就是不靠谱的典型案例
typeof {
} // "object"
typeof [] // "object"
typeof null // "object"
工具就这样, 作为使用者也是没有办法可言的, 能做的就只有另辟蹊径解决问题
所以有些年头的老码农会用另一个方法获取数据类型信息——Object.prototype.toString.call(_var)
Object.prototype.toString.call({
}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(null) // "[object Null]"
能获取目标数据类型的方法是 Object 原型链上的 toString(), 也就是 Object.prototype.toString(), 而且仅限于 Object 的 toString()
toString() 方法的本意是将目标值 _var 转成字符串格式
"转成字符串格式"这个需求之于不同数据类型, 就有不同的实现方法
所以各种类型的 toString() 几乎都是重写过的, 是只适用于自己类型的 toString()
// ["Array", "Boolean", "Date", "Error", "Function", "Number", "RegExp", "String", "Symbol"] 等大部分类型都重写了自己的 toString()
console.log(Array.prototype.toString === Object.prototype.toString) // false
console.log(Boolean.prototype.toString === Object.prototype.toString) // false
console.log(Date.prototype.toString === Object.prototype.toString) // false
console.log(Error.prototype.toString === Object.prototype.toString) // false
console.log(Function.prototype.toString === Object.prototype.toString) // false
console.log(Number.prototype.toString === Object.prototype.toString) // false
console.log(RegExp.prototype.toString === Object.prototype.toString) // false
console.log(String.prototype.toString === Object.prototype.toString) // false
console.log(Symbol.prototype.toString === Object.prototype.toString) // false
大部分类型的 toString() 互相不同, 也有部分 toString() 是一样的, 这里只需要知道toString() 的内容是由 toString() 作用的对象决定的就可以了
因为直接 _var.toString() 只会调用自己类型的 toString(), 其它类型的 toString() 不一定是 Object.prototype.toString()
所以其它类型的 toString() 都不可以实现这个需求
console.log("Array", ["A", "r", "r", "a", "y"].toString()