问答文章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-05-14 14:55

我来回答

3个回答

懂视网 时间:2022-05-14 19:16

最近做了做一些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-05-14 16:24

这里涉及到Object.prototype.toString.call()原因是b是个对象,不能作为属性。这里要强制转换为String。

为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。

编程:设计具备逻辑流动作用的一种“可控体系”【注:编程不一定是针对计算机程序而言的,针对具备逻辑计算力的体系,都可以算编程。】

热心网友 时间:2022-05-14 17:42

object.prototype.tostring.call 运用在什么场景下
  为什么要用Object.prototype.toString而不是Function.prototype.toString或者其它?这是和他们的toString解释方式有关系的。下面是ECMA中对Object.prototype.toString的解释:

  代码如下:

  Object.prototype.toString( )

  When the toString method is called, the following steps are taken:

  1. Get the [[Class]] property of this object.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
现在波兰的签证率高不高 去波兰如何办签证 去波兰办签证好办理吗 波兰签证好签吗 win7 多重网络 教师资格证普通话要多少级 想考教师资格证普通话必须过几级 qq影视会员SVIP和超级影视VIP的区别在哪里? 一小撮怎么造句 盛行一时怎么造句 93年的高中档案还能找到不 dell笔记本软键盘的问题 笔记本串键了怎么办,戴尔笔记本n5010 键盘右边的数字键串了,按1的时候出来10,按4和7的时候出来字母 高中生有没有能在网上查到的学籍档案 学生可不可以去查自己的学籍档案?(高中) DELL笔记本有时候断电到开不了机,有时候又很好,什么回事。 戴尔笔记本电脑打开网页后退格键变成网页后退了为什么 戴尔笔记本没有正常关机下拔掉电源线导致键盘按键部分失灵 笔记本电脑键盘打字乱码(急) DELL 键盘乱码 戴尔笔记本键盘乱码怎么办w变成s e变成c 你好,我一个手机绑定了两个支付宝,分别集齐了一套福,可以共同参与抽奖吗?还是只能一个账号参与抽奖? 参加抽奖登记、录入的手机号码的范围? 一个手机号码能多次参加优益C在线抽奖充值活动么? 同时在联通网上营业厅办固话和买手机卡,能抽两次奖吗? 联通手机营业厅通过【微信邀请好友】或【当面邀请好友】可以参加抽奖吗? 同一个天翼手机号码是否每天都可以参与抽奖? 我的好友分享给我一个抽签活动链接,我输入手机号后有什么奖励? vb10个固定手机号随机抽奖,用数组 区委副书记兼区长是否可以这样称谓? 华为m7怎么设置九宫格解锁 华为p9解锁怎么把输入方式弄成九宫格数字输入 华为荣耀4X怎样从数字锁屏改成九宫格锁屏? 打印机的耗材是什么意思? 华为c8812怎么设置九宫格那种锁屏 打印机双耗材是什么?与非双耗材比有什么用途和好处?谢谢 试驾东风标致e2008,好看又实用的电动小车 东风标致e2008今日上市,预售价18万起 鲜试车丨好看好开的法系小狮子,试驾全新一代东风标致2008/e2008 危机四伏?东风标致全新2008/e-2008上市,售价10.99万元起 全新东风标致2008/e2008上市 售10.99-18.80万元! object.prototype.tostring.call什么意思 东风标致全新一代2008/e2008上市 雄狮崛起力挽狂澜 3D i-Cockpit沉浸式座舱设计!东风标致全新2008预计5月20日上市 刚柔并济,体验东风标致2008/e2008 黄景瑜同款座驾,这台车你爱了吗? 如何看待移动社交电商行为 为什么过3.8妇女节 AutoCAD 2007激活码 怎么弄啊 cad2007的激活码要怎么样才能得到呢?拜托了各位 谢谢