网站 aspx 模板,班服定制的网站,个人域名邮箱怎么弄,做建材的网站好名字首先大家都应该知道在javascript中只有是对象都存在toString方法#xff0c;将调用该方法的值转换为字符串返回#xff0c;如下#xff1a; var arr [1, 2, 3];console.log(arr.toString()); //1,2,3 但对象的toString方法和其他优点不同#xff0c;其返回的是类似 [objec… 首先大家都应该知道在javascript中只有是对象都存在toString方法将调用该方法的值转换为字符串返回如下 var arr [1, 2, 3];console.log(arr.toString()); //1,2,3 但对象的toString方法和其他优点不同其返回的是类似 [object class]的字符串 一、在js中要想判断一个某个对象是属于哪种内置类型最靠谱的方法就是通过Object.prototype.toString()方法 var arr [1, 2, 3];console.log(Object.prototype.toString.call(arr)); //[object Array] 二、Object.prototype.toString()原理 ES3中关于Object.prototype.toString方法的解释 15.2.4.2 Object.prototype.toString() 在toString方法被调用时,会执行下面的操作步骤: 1. 获取this对象的[[Class]]属性的值. 2. 计算出三个字符串[object , 第一步的操作结果Result(1), 以及 ]连接后的新字符串. 3. 返回第二步的操作结果Result(2). [[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.[[class]]为一个表明该对象类型的内部属性其值类型为字符串。 所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[Class]]属性的值.[[Class]]属性的值可以用来判断一个原生对象属于哪种内置类型.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值(查看 15.2.4.2). 也就是说,把Object.prototype.toString方法返回的字符串,去掉前面固定的[object 和后面固定的],就是内部属性[[class]]的值,也就达到了判断对象类型的目的.jQuery中的工具方法$.type(),就是干这个的. 在ES3中,规范文档并没有总结出[[class]]内部属性一共有几种,不过我们可以自己统计一下,原生对象的[[class]]内部属性的值一共有10种.分别是:Array, Boolean, Date, Error, Function, Math, Number,Object, RegExp, String. es5中关于Object.prototype.toString()方法的解释 在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(this)的结果.让class成为O的内部属性[[Class]]的值.返回三个字符串[object , class, 以及 ]连接后的新字符串. 可以看出,比ES3多了1,2,3步.第1,2步属于新规则,比较特殊,因为Undefined和Null并不属于[[class]]属性的值,需要注意的是,这里和严格模式无关(大部分函数在严格模式下,this的值才会保持undefined或null,非严格模式下会自动成为全局对象).第3步并不算是新规则,因为在ES3的引擎中,也都会在这一步将三种原始值类型转换成对应的包装对象,只是规范中没写出来.ES5中,[[Class]]属性的解释更加详细: 所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是除了Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String之外的的任何字符串.[[Class]]内部属性是引擎内部用来判断一个对象属于哪种类型的值的.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值(查看 15.2.4.2). 和ES3对比一下,第一个差别就是[[class]]内部属性的值多了两种,成了12种,一种是arguments对象的[[class]]成了Arguments,而不是以前的Object,还有就是多个了全局对象JSON,它的[[class]]值为JSON.第二个差别就是,宿主对象的[[class]]内部属性的值,不能和这12种值冲突,不过在支持ES3的浏览器中,貌似也没有发现哪些宿主对象故意使用那10个值. 参考文章http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html 转载于:https://www.cnblogs.com/Walker-lyl/p/5597641.html