Javascript对象Oject的强制类型转换
众所周知Javascript作为一种动态类型,弱类型的脚本语言其数据类型在很多时候都会发生类型转换。而这些类型转换往往都是隐式的,这让我们在使用Js的时候会产生许多麻烦。而Js的基础数据类型的转换在此文中不过多阐述,主要记录Js对象数据类型的转换。笔者由于比较菜,若有写的不对的地方欢迎大佬在下方留言指正。
1.Number强制转换对象
let a={name:123};
console.log(Number(a));
我们先简单的声明一个对象,并用Number()对其进行强制类型转换
运行结果如下:
那么我们来分析一下对象经过强制类型转换为什么会变成NaN?
在这里就不得不提到Js对象所带有的两个方法,valueOf以及toString。
我们先说一下valueOf这个方法:
JavaScript调用valueOf方法将对象转换为原始值。你很少需要自己调用valueOf方法;当遇到要预期的原始值的对象时,JavaScript会自动调用它。
默认情况下,valueOf方法由Object后面的每个对象继承。 每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,则valueOf将返回对象本身。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。
以上描述源自MDN对valueOf方法的描述,下方给出不同数据类型valueof的返回值:
注意以上返回值是在你没有覆盖原有valueof的函数的情况下的返回值。
在上表中我们可以清楚的看到,对象返回的值是对象本身,结果如下:
接下来我们再说一下toString方法
一个对象在没有覆盖toString方法的情况下返回值应该为:
那么这两种方式和对象的强制类型转换有什么关系呢?
实际上当Number()强制类型转换Object对象时会进行如下操作:
1.先调用对象的valueOf方法
2.判断该方法的返回值是否为基础数据类型(Number,String,Boolean,Undefined,Null)
3.若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
4.若返回值不为基础数据类型,则在该返回值的基础上继续调用toString方法
5.判断toString的返回值是否为基础数据类型
6.判断是否为基础数据类型,若是基础数据类型则进行操作3
7.若仍旧不为基础数据类型则报错
下面我们对这些步骤进行验证:
这样看起来似乎解释的通,那么我们看看如果toString的返回值依旧是个对象看一下浏览器是否会报错吧:
果然当toString返回值仍旧为对象时Js报错了
那么我们在验证一下如果第一次调用valueof的返回值就是基础数据类型会发生什么?
所以Number强制转换对象的过程即为如上7步
2.String强制转换对象
首先依旧先声明一个简单的对象
为了与上面的区分这次我们创建一个对象b{name:b}
从上图我们可以看到强制转换的结果为"[object object]"
同样的下面是解密时间:
事实上String强制转换对象的步骤与Number类似,也分为类似的7个步骤:
1.先调用对象的toString方法
2.判断该方法的返回值是否为基础数据类型(Number,String,Boolean,Undefined,Null)
3.若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
4.若返回值不为基础数据类型,则在该返回值的基础上继续调用valueOf方法
5.判断valueOf的返回值是否为基础数据类型
6.判断是否为基础数据类型,若是基础数据类型则进行操作3
7.若仍旧不为基础数据类型则报错
String与Number的区别则在于
Number是先调用valueOf再调用toString
而String是先调用toString再调用valueof
为了方便下面会以一张图对此进行说明:
所以这就是String转换对象的原理
3.Boolean强制转换对象
我们知道在Js中用于能在判断时为false的只有5个值
1.undefined
2.null
3.‘’//空字符串
4.0
5.NaN
其他值在判断时都为true,而if判断时是使用了Boolean进行转换的
所以对象经过Boolean转换的值为true
——————————————————————————————————————————————————————————————————
所以一些有趣的面试题的答案也就有了解释:
{}+{}
{}+[]
[]+[]
[]+{}
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
使用WeakHashMap创建具有过期时间的本地缓存
java中为了让程序员能参与到垃圾回收机制中(不是说java的GC是全自动的吗?这要看从哪个方面讲了,其实如果开发人员能熟练掌握java的gc原理,对提升系统的稳定性有极大帮助),设计了4种引用级别:分别是强引用(new 出来的)、软引用、弱引用和虚引用。 本文不打算介绍这几种引用的用法。还不了解它们的读者可以自行百度(国内的几个搜索引擎,还是百度 最适合程序员)。不过如果能使用谷歌的还是要使用谷歌,因为各个级别都有大坑,使用不当可能完全发挥不了期望的效果。但是国内很少有文章讲其中的注意事项,可能是使用的场景太少了。而国外(比如dzone)的博客就不少。 弱引用的对象在每次垃圾回收的时候都会被处理掉。WeakHashMap就是利用了这个特性来实现的本地缓存。 WeakHashMap的具体用法也请百度。这里假设你已经在用WeakHashMap了 WeakHashMap实现的缓存虽然好用,但是不具备定时过期的特性。如果没有等到垃圾回收(或者我不去看监控根本不知道是否进行过垃圾回收),但是想更新缓存之值,就无能为力了! 所以这里我们个WeakHashMap增加一个过期时间。 有两种方式实现:...
-
下一篇
C#调用Windows(8/10)自带的虚拟键盘
原文: C#调用Windows(8/10)自带的虚拟键盘 以下是调用代码: private const Int32 WM_SYSCOMMAND = 274; private const UInt32 SC_CLOSE = 61536; [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Au...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL表碎片整理
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL数据库中FOR UPDATE的使用











微信收款码
支付宝收款码