问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

object.prototype.tostring.call什么意思

发布网友 发布时间:2022-04-22 13:57

我来回答

2个回答

懂视网 时间:2022-04-22 18:18

最近做了做一些js面试25 Essential JavaScript Interview Questions*,其中第一道是:使用typeof bar === "object"检测”bar”是否为对象有什么缺点?如何避免?

这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的,null 的结果也是 object,Array 的结果也是 object,有时候我们需要的是 "纯粹" 的 object 对象。如何避免呢?比较好的方式是:

console.log(Object.prototype.toString.call(obj) === "[object Object]");

使用以上方式可以很好的区分各种类型:

(无法区分自定义对象类型,自定义类型可以采用instanceof区分)

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]

为什么这样就能区分呢?于是我去看了一下toString方法的用法: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

同样是检测对象obj调用toString方法(关于toString()方法的用法的可以参考toString的详解),obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

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

总结:

热心网友 时间:2022-04-22 15:26

object prototype to string call

字符串调用的对象原型
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 养宠物的人遵守规则,是不是就能和别人平安相处呢? 全新东风标致2008/e2008上市 售10.99-18.80万元! 危机四伏?东风标致全新2008/e-2008上市,售价10.99万元起 鲜试车丨好看好开的法系小狮子,试驾全新一代东风标致2008/e2008 东风标致e2008今日上市,预售价18万起 试驾东风标致e2008,好看又实用的电动小车 打印机双耗材是什么?与非双耗材比有什么用途和好处?谢谢 华为c8812怎么设置九宫格那种锁屏 打印机的耗材是什么意思? 华为荣耀4X怎样从数字锁屏改成九宫格锁屏? 华为p9解锁怎么把输入方式弄成九宫格数字输入 华为m7怎么设置九宫格解锁 请教关于Object.prototype.toString.call 93年的高中档案还能找到不 dell笔记本软键盘的问题 笔记本串键了怎么办,戴尔笔记本n5010 键盘右边的数字键串了,按1的时候出来10,按4和7的时候出来字母 高中生有没有能在网上查到的学籍档案 学生可不可以去查自己的学籍档案?(高中) DELL笔记本有时候断电到开不了机,有时候又很好,什么回事。 戴尔笔记本电脑打开网页后退格键变成网页后退了为什么 戴尔笔记本没有正常关机下拔掉电源线导致键盘按键部分失灵 东风标致全新一代2008/e2008上市 雄狮崛起力挽狂澜 3D i-Cockpit沉浸式座舱设计!东风标致全新2008预计5月20日上市 刚柔并济,体验东风标致2008/e2008 黄景瑜同款座驾,这台车你爱了吗? 如何看待移动社交电商行为 为什么过3.8妇女节 AutoCAD 2007激活码 怎么弄啊 cad2007的激活码要怎么样才能得到呢?拜托了各位 谢谢 - 信息提示 顶极的近义词。 女“海王”同时交往13名男友,诈骗了多少钱? 洛阳火车站,附近经常有,大妈揽人,说有美女小姑娘,五十一次,请问是真是假?有啥大风险没有?_百度问一问 洛阳美女多吗? 哪位大神知道洛阳市哪个大学门口可以约美女 洛阳伊川那个地方的美女多 洛阳美女多吗?性格怎么样啊? 怎样获取美女 怎么才能加到女生? 米勒的女朋友是谁 怎么查询注册时间