js 浅析 Object.prototype.toString.call(_var) 获取数据类型原理

在JavaScript中,由于其弱类型特性,获取数据类型往往成为开发者面临的问题。通常的typeof操作符可能并不准确。本文探讨了一种更可靠的方法——使用Object.prototype.toString.call(_var),解释了其工作原理,以及为何通过.call()调用能确保获取正确数据类型的缘由。此外,还分享了一个演示如何将常见类型转换为使用Object.prototype.toString()来获取数据类型的示例,尽管这并不推荐在实际开发中使用。
摘要由CSDN通过智能技术生成

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值