博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Object.prototype.toString.call()】---判断某个对象属于哪种内置类型------【巷子】...
阅读量:4708 次
发布时间:2019-06-10

本文共 2094 字,大约阅读时间需要 6 分钟。

预热:目前我们知道区分对象类型的方式有三种 :type   instanceof   Object.prototype.toString.call. 那么这三种的区别是什么呢?

 

type

 

在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。

 

对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

 

instanceof

var a = {};var b = [];var c = function () {};//a b c 都是 Object 的实例console.log(a instanceof Object) //trueconsole.log(b instanceof Object) //trueconsole.log(c instanceof Object) //true//只有 Array 类型的 b 才是 Array 的实例console.log(a instanceof Array) //falseconsole.log(b instanceof Array) //trueconsole.log(c instanceof Array) //false//只有 Function 类型的 c 才是 Function 的实例console.log(a instanceof Function) //falseconsole.log(b instanceof Function) //falseconsole.log(c instanceof Function) //true

 

Object.prototype.toString.call()

console.log(Object.prototype.toString.call(123)) //[object Number] console.log(Object.prototype.toString.call('123')) //[object String] console.log(Object.prototype.toString.call(undefined)) //[object Undefined] 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(function(){})) //[object Function]

 

为什么必须用Object.prototype.toStirng.call而不能直接用toString这个方法

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

 

转载于:https://www.cnblogs.com/nanianqiming/p/8797390.html

你可能感兴趣的文章
pyinstaller使用教程
查看>>
把 AfxBeginThread 用 CreateThread 代替
查看>>
[LeetCode] 4Sum
查看>>
c# DateTime 时间
查看>>
Head First设计模式之访问者模式
查看>>
Layui上传图片(王元玮版)
查看>>
android中的Handler消息传输机制
查看>>
实验三 进程调度模拟程序
查看>>
拍照并保存
查看>>
body用渐变图片作背景
查看>>
字符串题表
查看>>
Application windows are expected to have a root view controller at the end of application launch
查看>>
归并排序
查看>>
Deep RL Bootcamp Lecture 3: Deep Q-Networks
查看>>
Vue引入jQuery
查看>>
Intellij IDEA 像eclipse那样给maven添加依赖
查看>>
网页截图像素与实际像素不一致问题
查看>>
QT容器map的插入,修改,遍历
查看>>
递归算法--写实例----阶乘问题---整数划分问题
查看>>
hibernate分表保存日志
查看>>