为什么toString方法可以用来区分数组和对象?

  首先大家都应该知道在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方法被调用时,会执行下面的操作步骤:

  1. 如果this的值为undefined,则返回"[object Undefined]".
  2. 如果this的值为null,则返回"[object Null]".
  3. O成为调用ToObject(this)的结果.
  4. class成为O的内部属性[[Class]]的值.
  5. 返回三个字符串"[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平安 开源 数据库 实践_刻意的实践-成为开源

平安 开源 数据库 实践by Anthony Ng由Anthony Ng 刻意的实践-成为开源 (Deliberate Practice — Becoming an Open Sourcerer) I recently finished reading Cal Newport’s book, So Good They Can’t Ignore You. It’s a quick read, and it introduced me to the concept…

更新Composer依赖报错处理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe...

更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRepository::search() must be compatible with Composer\Repository\RepositoryInterface::search($query, $mode 0, $type NULL) in C:\Users\Arthur\AppData\Ro…

解析su,su -,sudo的区别

2019独角兽企业重金招聘Python工程师标准>>> 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令&#xff…

java 前置通知_spring aop中的前置通知

fixassetServicemyInterceptormyInterceptor2在上面的配置文件中 我配置了两个interceptor ,这两个interceptor的invoke方法中的逻辑是一样的。public Object invoke(MethodInvocation invo) throws Throwable {//自己的横切逻辑log....invo.proceed()}我想请教的问…

Java并发编程艺术读书笔记

1、多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存。所以,可合理控制线程数量。 如何控制: (1)使用ps -ef|grep appname&#…

您可能不需要翻译您JavaScript

by Alex Ewerlf由AlexEwerlf 您可能不需要翻译您JavaScript (You might not need to transpile your JavaScript) Popular guides like YouMightNotNeedJQuery.com and You Don’t Need Lodash/Underscore have challenged common industry practices.诸如YouMightNotNeedJQue…

java maven 操作 收集的一些命令

maven打包: mvn clean package -Dmaven.test.skiptrue 运行jar: java -jar target/spring-boot-scheduler-1.0.0.jar 这种方式关掉控制台就不可以访问,现在要后台运行的方式启动 nohup java -jar target/spring-boot-scheduler-1.0.0.jar & 清理并…

手机h5 java平台_H5 手机 App 开发入门:技术篇

1、手机 App 的技术栈手机 App 的技术栈可以分成三类原生 App 技术栈原生技术栈指的是,只能用于特定手机平台的开发技术。比如,安卓平台的 Java 技术栈,iOS 平台的 Object-C 技术栈或 Swift 技术栈。混合 App 技术栈混合技术栈指的是开发混合…

《Java程序设计》学期总结

《Java程序设计》 学期总结 课程设计小组 -迦瓦栈队 团队博客 读书笔记汇总第一周第二周第三周第四周第五周第六周第七周第八周第九周第十周 实验报告汇总实验一实验二实验三实验四实验五 代码托管链接GitOSC 课程收获与不足 上了一学期的课,收获当然后很多&#xf…

012-- mysql的分区和分表

分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中。 mysql支持的分区类型包括Range、List、Hash、Key,其中Range比较常用: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST分区:类…

中科大计算机专业少实习_为什么很少有计算机科学专业的人?

中科大计算机专业少实习Hong Kong-based technology writer Dan Wang wrote a blog post exploring why so few people get degrees in computer science. And yes — it’s far fewer people than those who study other science and engineering fields.驻香港的技术作家王丹…

java犯的小错误_[Java教程]十个JavaScript中易犯的小错误,你中了几枪?

[Java教程]十个JavaScript中易犯的小错误,你中了几枪?0 2015-06-01 12:00:19序言在今天,JavaScript已经成为了网页编辑的核心。尤其是过去的几年,互联网见证了在SPA开发、图形处理、交互等方面大量JS库的出现。如果初次打交道&…

Kali渗透测试——利用metasploit攻击靶机WinXP SP1

搭建渗透测试环境 Kali攻击机 WinXP SP1 靶机 启动metasploit 跟windows RPC相关的漏洞 内部提供的漏洞攻击 靶机winxp sp1网络配置 查看虚拟机的NAT网段 配置WinXP SP1靶机的IP地址 执行漏洞利用 后漏洞利用:meterpreter> 靶机的信息 进程情况 查看到explorer.e…

创建响应式布局的优秀网格工具集锦《系列五》

在这篇文章中,我们为您呈现了一组优秀的网格工具清单。如果网页设计和开人员采用了正确的工具集,并基于一个灵活的网格架构,以及能够把响应图像应用到到设计之中,那么创建一个具备响应式的网站并不一定是一项艰巨的任务。enjoy! 您…

【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)

1.WKWebview加载html文本图片过大,没有自适应屏幕宽高。 在用Webview加载html文本有时候会遇到加载的图片过大,不能自适应屏幕宽高的问题。那么如何解决这个问题?如何使图片自适应屏幕?很简单,只需要加一个js就可以。 …

如何使用Create React App DevOps自动化工作中所有无聊的部分

by James Y Rauhut詹姆士鲁豪(James Y Rauhut) 如何使用Create React App DevOps自动化工作中所有无聊的部分 (How I automate all of the boring parts of my job with Create React App DevOps) When you have responsibilities as one of the only designers — and possib…

java 无侵入监控_MyPerf4J 一个高性能、无侵入的Java性能监控和统计工具

MyPerf4J一个针对高并发、低延迟应用设计的高性能且无侵入的实时Java性能监控和统计工具。 受 perf4j 和 TProfiler启发而来。MyPerf4J具有以下几个特性:无侵入: 采用JavaAgent方式,对应用程序完全无侵入,无需修改应用代码高性能: 性能消耗非…

Apple Swift编程语言新手教程

文件夹 1 简单介绍2 Swift入门3 简单值4 控制流5 函数与闭包6 对象与类7 枚举与结构1 简单介绍 今天凌晨Apple刚刚公布了Swift编程语言,本文从其公布的书籍《The Swift Programming Language》中摘录和提取而成。希望对各位的iOS&OSX开发有所帮…

javascript 减少回流

减少回流(REFLOWS) 当浏览器重新渲染文档中的元素时需要 重新计算它们的位置和几何形状,我们称之为回流。回流会阻塞用户在浏览器中的操作,因此理解提升回流时间是非常有帮助的。 回流时间图表 你应该批量地触发回流或重绘&#x…

[国家集训队] 特技飞行

题目背景 1.wqs爱好模拟飞行。 2.clj开了一家神犇航空,由于clj还要玩游戏,所以公司的事务由你来打理。 注意:题目中只是用了这样一个背景,并不与真实/模拟飞行相符 题目描述 神犇航空开展了一项载客特技飞行业务。每次飞行长N个单…