1.6判断类型toString.call()

本文深入探讨了JavaScript中对象类型的准确判断方法。介绍了typeof和obj.toString()的局限性,及Object.prototype.toString.call(obj)的优势,解析了不同对象类型调用toString方法的原理。

之前我都是使用typeof,后来发现它的判断有局限,例如(){}
obeject.p.toString.call()解决了

obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

        这是因为toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。

 

转载于:https://www.cnblogs.com/-constructor/p/10694837.html

### 作用 `Object.prototype.toString.call()` 是 JavaScript 中用于检测变量类型的强大工具。它能够准确区分所有 JavaScript 内置类型,包括原始类型(如 `null`、`undefined`、`number`、`string` 等)和对象类型(如 `Array`、`Date`、`Function` 等)[^5]。与直接调用对象的 `toString()` 方法不同,`Object.prototype.toString.call()` 不依赖对象自身的 `toString()` 实现,而是通过传入任意值并返回其类型信息,确保结果的准确性和一致性[^1]。 该方法的核心优势在于其通用性和准确性。例如,使用 `typeof` 检测 `null` 时会返回 `"object"`,而 `Object.prototype.toString.call()` 可以明确返回 `[object Null]`,从而避免歧义[^5]。 ### 使用示例 可以通过以下方式使用 `Object.prototype.toString.call()` 来判断不同类型: ```javascript console.log(Object.prototype.toString.call(null)); // [object Null] console.log(Object.prototype.toString.call(undefined)); // [object Undefined] console.log(Object.prototype.toString.call(123)); // [object Number] console.log(Object.prototype.toString.call('hello')); // [object String] console.log(Object.prototype.toString.call(true)); // [object Boolean] console.log(Object.prototype.toString.call({})); // [object Object] console.log(Object.prototype.toString.call([])); // [object Array] console.log(Object.prototype.toString.call(new Date())); // [object Date] console.log(Object.prototype.toString.call(function() {})); // [object Function] ``` ### 注意事项 虽然 `Object.prototype.toString.call()` 是一种强大的类型检测方法,但它也存在一些不足之处。例如,其语法相对繁琐,需要使用 `.call()` 方法并传入目标值作为上下文,这在现代 JavaScript 开发中显得不够简洁[^2]。此外,返回值是一个字符串,需要进一步解析才能提取类型信息,这可能影响代码的可读性和性能[^2]。 另外,需要注意的是,如果修改了 `Object.prototype.toString` 的指向,可能会影响其行为。例如,将 `Object.prototype.toString` 重写为返回固定值,会导致所有调用该方法的对象返回相同结果[^4]。 ### 与其他方法的对比 - **`typeof`**:无法准确区分 `null` 和对象,也无法识别 `Array` 或 `Date` 等内置对象类型。 - **`instanceof`**:依赖原型链,不能跨环境使用,例如在不同 iframe 中创建的对象可能无法正确识别。 - **`Array.isArray()`**:仅适用于检测数组类型,无法用于检测其他类型[^3]。 相比之下,`Object.prototype.toString.call()` 提供了更全面、可靠的类型检测能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值