资讯专栏INFORMATION COLUMN

Object.prototype.toString.call(obj) 与 obj.toStrin

bang590 / 1343人阅读

摘要:判断一个变量的类型通常使用这样的方式也可以去判断一个变量的类型,但问题在于不严谨。另外,不直接使用方法的原因,还有一个就是对象的方法有可能会被改写。

判断一个变量的类型 typeof

通常使用 typeof a; 这样的方式也可以去判断一个变量的类型,但问题在于不严谨。比如:

typeof null;   // object
typeof [];     // object

但有时候,我们需要的是更‘纯粹’的对象,这个时候怎么办呢?

Object.prototype.toString.call(obj)

使用如标题那样的方式可以更好的区分各种变量的类型:

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));     //[object Number]
console.log(Object.prototype.toString.call(true));   //[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));   //[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));    //[object Function]
console.log(Object.prototype.toString.call([]));        //[object Array]
console.log(Object.prototype.toString.call(new Date));        //[object Date]
console.log(Object.prototype.toString.call(/d/));        //[object RegExp]

美中不足的是,无法区分出自定义对象:

function Person(){};
console.log(Object.prototype.toString.call(new Person));    //[object Object]

但还有 instanceof

new Person()  insatnceof Person;   // true

为什么这样可以区分呢?
因为toStirng方法返回一个变量(包含对象)的字符串表示方式。那既然这样,为什么不直接使用obj.toString呢 ?

obj.toString
console.log("jerry".toString());    //jerry
console.log((1).toString());        //1
console.log([1,2].toString());      //1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());        //error
console.log(undefined.toString());   //error

同样是检测变量类型的方法,Object.prototype.toString.call(obj) 与 obj.toStirng 怎么会结果不一样呢?

这是因为toString方法是Objectde 原型方法,而 Array, function等类型作为Object的实例(Function是Object的子类,function又是Function的实例),都继承并重写了toString方法,不同的对象类型的对象调用toStirng方法时,其实调用的是重回写之后的toString方法,而不再去调用Object原型上的toString方法了。

我们可以验证一下,将数组的toString方法删除,看看会是什么结果:

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));    //true
console.log(arr.toString());    //1,2,3
delete Array.prototype.toString;    //delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));    //false
console.log(arr.toString());    //"[object Array]"

删除了Array的toString方法后,同样再采用arr.toString()方法调用时,不再有屏蔽Object原型方法的实例方法,因此沿着原型链,arr最后调用了Object的toString方法,返回了和Object.prototype.toString.call(arr)相同的结果。

另外,不直接使用obj.toString方法的原因,还有一个就是obj对象的toString方法有可能会被改写。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89225.html

相关文章

  • 标准库(一)object对象

    摘要:控制对象状态的方法防止对象扩展。判断一个对象是否被冻结。返回当前对象对应的值。方法的作用是返回一个对象的字符串形式上面代码表示,对于一个对象调用方法,会返回字符串用途通过自定义方法,可以让对象在自动类型转换时,得到想要的字符串形式。 概述Object()Object 构造函数Object 的静态方法「本身的方法Object.keys(),Object.getOwnPropertyNam...

    Muninn 评论0 收藏0
  • javascript 数据类型判断 (常见库的数据类型判断源码的分析)

    摘要:对象类型常见的有,,,正则新增自己提供的乐行判断如果不对对象做严格区分使用。的实现使用了原型继承的表示左表达式,表示右表达式,它是用是否等于来判断对象的类型的。常见框架和库的实数据类型判断测试这里将的实现原理抽取出来,用原生实现。 JavaScript一共有六种数据类型,分为原始类型(又名基本类型)和对象类型(又名引用类型) 原始类型有五种,分别为number,string,boole...

    libin19890520 评论0 收藏0
  • JS 中 __proto__ 和 prototype 存在的意义是什么?

    摘要:那么也一并被删除了。然后我们基本就没法写代码了不存在,因为没有定义过啊的意义就是把共有属性预先定义好,给之后的对象用。 本文为饥人谷讲师方方原创文章。 showImg(https://segmentfault.com/img/remote/1460000013249596?w=720&h=504); 你的 JS 代码还没运行的时候,JS 环境里已经有一个 window 对象了 win...

    msup 评论0 收藏0
  • 关于一些前端js框架的源码研究

    摘要:的作用相当于,将其转换为布尔值。用于判断一个变量是否某个对象的实例,如返回同时也会返回返回布尔值,如果为,则返回,否则返回的结果。 underscore.js源码 Underscore.js 没有对原生 JavaScript 对象进行扩展,而是通过调用 _() 方法进行封装,一旦封装完成,原生 JavaScript 对象便成为一个 Underscore 对象。 判断给定变量是否是对象 ...

    whjin 评论0 收藏0
  • jQuery中的isPlainObject()方法 实现原理

    摘要:说明中的函数用于判断指定参数是否是一个纯粹的对象,返回值为类型。使用语法参数说明任意类型需要进行判断的任意值。函数的方法会返回一个表示函数源代码的字符串。具体来说,包括关键字,形参列表,大括号,以及函数体中的内容。 说明 jQuery中的isPlainObject() 函数用于判断指定参数是否是一个纯粹的对象,返回值为Boolean类型。 纯粹的对象,就是通过 { }、new Obje...

    leon 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<