菜单

JavaScript中Object.prototype.toString方法的原理_javascript技巧_脚本之家

2020年3月12日 - 澳门太阳娱乐手机登录

在JavaScript中,想要判定有些对象值归于哪个种类内置类型,最可信的做法正是通过Object.prototype.toString方法.

var arr = [];console.log(Object.prototype.toString.call //"[object Array]"

正文要讲的就是,toString方法是什么达成那一点的,原理是什么.

ECMAScript 3

在ES3中,Object.prototype.toString方法的行业内部如下:

15.2.4.2 Object.prototype.toString()

在toString方法被调用时,会施行下边包车型地铁操作步骤:

  1. 获取this对象的[[Class]]品质的值.

  2. 测算出四个字符串”[object “, 第一步的操作结果Result, 以致”]”连接后的新字符串.

  3. 归来第二步的操作结果Result.

[[Class]]是三个里边属性,全部的对象都具有该属性.在行业内部中,[[Class]]是这般定义的

里头属性

描述

[[Class]] 一个字符串值,评释了该目的的类型.

具有内置对象的[[澳门太阳娱乐手机登录,Class]]品质的值是由本规范定义的.全部宿主对象的[[Class]]品质的值能够是大肆值,以至足以是放置对象使用过的[[Class]]质量的值.[[Class]]品质的值能够用来判断一个原生对象归于哪一种内置类型.须求小心的是,除了通过Object.prototype.toString方法之外,本专门的学问未有提供别的别的艺术来让程序访谈该属性的值.

也正是说,把Object.prototype.toString方法重回的字符串,去掉前面固定的”[object
“和前面固定的”]”,正是中间属性[[class]]的值,也就抵达了判定指标类型的目标.jQuery中的工具方法$.type(卡塔尔(قطر‎,正是干那些的.

在ES3中,标准文书档案并不曾下结论出[[class]]个中属性一共有二种,可是大家可以协和总括一下,原生对象的[[class]]当中属性的值一共有10种.分别是:”Array”,
“Boolean”, “Date”, “Error”, “Function”, “Math”, “Number”, “Object”,
“RegExp”, “String”.

ECMAScript 5

在ES5.1中,除了正式写的更详实一些以外,Object.prototype.toString方法和[[class]]其间属性的概念上也是有部分变化,Object.prototype.toString方法的正式如下:

15.2.4.2 Object.prototype.toString

在toString方法被调用时,会施行上边包车型地铁操作步骤:

如果this的值为undefined,则返回”[object Undefined]”.

如果this的值为null,则返回”[object Null]”.

让O成为调用ToObject的结果.

让class成为O的中间属性[[Class]]的值.

重临多少个字符串”[object “, class, 以及 “]”连接后的新字符串.

可以看看,比ES3多了1,2,3步.第1,2步归于新法规,比较新鲜,因为”Undefined”和”Null”并不归于[[class]]质量的值,需求在意的是,这里和从严形式毫无干系(大多数函数在严格格局下,this的值才会维持undefined或null,非严厉格局下会自动变成全局对象State of Qatar.第3步并不算是新法则,因为在ES3的引擎中,也都会在此一步将两种原始值类型转变来相应的卷入对象,只是规范中没写出来.ES5中,[[Class]]天性的表明尤其详实:

装有内置对象的[[Class]]质量的值是由本专门的工作定义的.全体宿主对象的[[Class]]属性的值能够是除了”Arguments”,
“Array”, “Boolean”, “Date”, “Error”, “Function”, “JSON”, “Math”,
“Number”, “Object”, “RegExp”,
“String”之外的的别的字符串.[[Class]]内部属性是引擎内部用来判断二个指标归属哪类别型的值的.供给留意的是,除了通过Object.prototype.toString方法之外,本职业未有提供别的其余方法来让程序访谈该属性的值.

和ES3对照一下,第三个不一样正是[[class]]其间属性的值多了二种,成了12种,一种是arguments对象的[[class]]成了”Arguments”,并非从前的”Object”,还会有正是多个了全局对象JSON,它的[[class]]值为”JSON”.次之个差异正是,宿主对象的[[class]]个中属性的值,不能够和这12种值冲突,然则在协理ES3的浏览器中,貌似也绝非发觉什么宿主对象故意使用那十三个值.

ECMAScript 6

ES6脚下还只是做事草案,但能够料定的是,[[class]]其间属性未有了,代替他的是此外叁个里面属性[[NativeBrand]].[[NativeBrand]]质量是那样定义的:

当中属性

属性值

描述

[[NativeBrand]] 枚举NativeBrand的三个成员.
该属性的值对应多个标识值,能够用来分别原生对象的类型.

[[NativeBrand]]属性的解释:

[[NativeBrand]]其间属性用来识别某些原生对象是还是不是为顺应本专门的学业的某一种特定类型的对象.[[NativeBrand]]个中属性的值为上面那几个枚举类型的值中的一个:NativeFunction,
NativeArray, StringWrapper, BooleanWrapper, NumberWrapper, NativeMath,
NativeDate, NativeRegExp, NativeError, NativeJSON, NativeArguments,
NativePrivateName.[[NativeBrand]]当中属性仅用来区分区分特定类型的ECMAScript原生对象.唯有在表10中分明提议的靶子类型才有[[NativeBrand]]里头属性.

表10 — [[NativeBrand]]内部属性的值

属性值

对应类型

NativeFunction Function objects NativeArray Array objects StringWrapper
String objects BooleanWrapper Boolean objects NumberWrapper Number
objects NativeMath The Math object NativeDate Date objects NativeRegExp
RegExp objects NativeError Error objects NativeJSON The JSON object
NativeArguments Arguments objects NativePrivateName Private Name objects

可见,和[[class]]不等的是,并非种种对象都存有[[NativeBrand]].相同的时间,Object.prototype.toString方法的正规也改成了上面那样:

15.2.4.2 Object.prototype.toString

在toString方法被调用时,会推行上边包车型客车操作步骤:

如果this的值为undefined,则返回”[object Undefined]”.

如果this的值为null,则返回”[object Null]”.

让O成为调用ToObject的结果.

如果O有[[NativeBrand]]当中属性,让tag成为表29中对应的值.

让hasTag成为调用O的[[HasProperty]]里面方法后的结果,参数为@@toStringTag.

如果hasTag为false,则让tag为”Object”.

让tag成为调用O的[[Get]]其间方法后的结果,参数为@@toStringTag.

如果tag是一个abrupt completion,则让tag成为NormalCompletion.

让tag成为tag.[[value]].

即使Type不是字符串,则让tag成为”???”.

如果tag的值为”Arguments”, “Array”, “Boolean”, “Date”, “Error”,
“Function”, “JSON”, “Math”, “Number”, “Object”, “RegExp”,或

者”String”中的任贰个,则让tag成为字符串”~”和tag当前的值连接后的结果.

重临多少个字符串”[object “, tag, and “]”连接后的新字符串.

表29 — [[NativeBrand]] 标志值

[[NativeBrand]]值

标志值

NativeFunction "Function" NativeArray "Array" StringWrapper
"String" BooleanWrapper "Boolean" NumberWrapper "Number"
NativeMath "Math" NativeDate "Date" NativeRegExp "RegExp"
NativeError "Error" NativeJSON "JSON" NativeArguments "Arguments"

能够看来,在专门的职业上有了异常的大的变化,可是对此普通客户来讲,貌似认为不到.

想必你意识了,ES6里的新品类Map,Set等,都不曾经在表29中.它们在试行toString方法的时候回来的是哪些?

console.log(Object.prototype.toString.call //"[object Map]"console.log(Object.prototype.toString.call //"[object Set]"

中间的字符串”Map”是怎么来的吗:

15.14.5.13 Map.prototype.@@toStringTag

@@toStringTag 属性的早先值为字符串”Map”.

出于ES6的正经八百还在制定中,各类有关规定皆有希望修改,所以倘若想询问越来越多细节.看看下边这七个链接,以往只必要精通的是:[[class]]没了,使用了更头晕目眩的机制.

上述所述是笔者给大家大吃大喝的JavaScript中Object.prototype.toString方法的规律,希望对大家拥有利于!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图