带你玩转JavaScript中的隐式强制类型转换
正题开始前我想先抛出一个问题,==和===有什么区别?可能一般人会想,不就是后者除了比较值相等之外还会比较类型是否相等嘛,有什么好问的,谁不知道?!但是这样说还不够准确,两者的真正区别其实是==在比较的时候允许做强制类型转换,而===不允许。好了终于引出了今天的重点,我们平时肯定遇到过强制类型转换的时候,死活想不通为什么要这样转换(为什么这两个相等)的情况。那么下面我就以==为例,来说明一下其中强制类型转换的规则。
前提知识
JavaScript中的假值:undefined、null、false、+0、-0、NaN和" "
1.字符串和数字相等比较
25 == "25" //true
第一种情况比较简单,当字符串和数字之间相等比较的时候,都会先将字符串强制转换成数字再比较
2.其他类型和布尔类型相等比较
"25" == false //false
"0" == false //true
第二种情况,当其他类型和布尔类型相等比较的时候,都会先将布尔类型强制转换为数字再比较。
右边的false强制转换为数字结果是0,然后再运用上面第一条规则,"0"强制转换为0,所以"0" == false返回的结果是true
3.对象和非对象相等比较
"abc" == Object("abc"); //true
null == Object(null); //false
undefined == Object(undefined); //false
NaN == Object(NaN); //false
第三种情况,如果是对象(对象、函数、数组)和非对象之间相等比较时,会进行ToPrimitive操作(转换为原始类型)。
什么是ToPrimitive操作呢,其实ToPrimitive操作就是先执行valueOf()方法,如果结果为原始值,则返回此结果;否则,执行toString()方法,如果结果是原始值,则返回此结果;否则,抛出TypeError错误。
拿上面的第一个为例,Object("abc")执行ToPrimitive操作后,返回了"abc"原始值,所以结果为true。
Object(null)和Object(undefined)执行完ToPrimitive操作后和Object()是一样的,所以结果为false。
最后一个结果为false,是因为NaN不等于NaN。
特殊情况
还有一种特殊情况,null == undefined(别问我为什么,这个是规定)
小检验
false == "";
false == [];
"" == 0;
"" == [];
0 == [];
"" == [null];
看了之前的分析,检验一下吧,看看上面几个应该是true还是false呢?
总结
其实总结下来就三个口诀:
1.字符串类型和数字类型相等比较,字符串强转数字,再比较。
2.其他类型和布尔类型相等比较,布尔类型强转数字,再比较。
3.对象和非对象相等比较,执行ToPrimitive()操作,再比较。
有了这三个口诀(知道了转换原理),我相信任何情况我们都不再懵逼了。
写在最后
有一年没有更新博客了,回想一下,一是因为公司业务缠身,二是因为去年经历一些事情打击了我,其实这些也都是借口吧,最近看到强制类型转换这个方面有点绕,正好跟大家分享一下,希望之后能够坚持吧,多分享一些东西,对自己也是一种督促与进步吧。
最后感谢大家的阅读,有什么分析的不对的地方欢迎大家批评指出,如果喜欢本文,请点击右下角的推荐哦~
带你玩转JavaScript中的隐式强制类型转换的更多相关文章
- javascript中的隐式类型转化
javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...
- JavaScript中关于隐式转换的一些总结
JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类 ...
- JavaScript基础避免隐式的类型转换(004)
JavaScript在普通对比运算符“==”执行时可能会进行隐式的类型转换.比如:false==0和""==0的结果都是true.同理也适合于"!="运算符.要 ...
- C语言隐式强制类型转换
今天又被精度问题困扰,把最基本的东西忘了. int n = 5; int cnt = 5.5; double sum = (n-cnt); 运算完后sum是 -0.5.不知道什么时候n转换成doub ...
- Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- 编写高质量代码改善C#程序的157个建议——建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理
建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理 在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// <summary> /// 必须,防止程序员忘记 ...
- 也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)
在上一篇文章也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强中,我提到了隐式数据类型转换添加对于数据分布非常不平均的表.评估的数据行数与实际值有非常大出入的问题,进一步測试之 ...
- 深入探究js中的隐式变量声明
前两天遇到的问题,经过很多网友的深刻讨论,终于有一个相对可以解释的通的逻辑了,然后我仔细研究了一下相关的点,顺带研究了一下js中的隐式变量. 以下文章中提到的隐式变量都是指没有用var,let,con ...
随机推荐
- 仿手机iPhone QQ消息小红点动画1
前言 偶然发现iPhone QQ 显示消息条数的小红点可以响应动作事件,也有人问我这样的动画该怎么做,这里就把实现的思路简单的描述一下.在实现的过程中,同样发现该功能并没有看到的那么简单,要做一个完备 ...
- 偏前端 - div+mui+vue.js 制作问卷调查单页 ——题目答案由后台随机给出10道
封装的ajax获取数据.代码可能有些是多余的,没做处理!!点击提交后有弹框,在这里我没有贴出来.第一次写博客,这些也是别人教我的,经理解后,贴出来于大家分享 ——html—— <script t ...
- 基于 HTML5 WebGL 智能城市的模拟运行
前言 智能城市是一个系统.也称为网络城市.数字化城市.信息城市. 智能城市建设是一个系统工程:首先实现的是城市管理智能化,由智能城市管理系统辅助管理城市,通过管理系统人们可以监视城市的运行,了解城市每 ...
- webstorm累计
websorm官网下载安装: 1.一下粗略截图说明,点击下一步下一步安装到合适的路径下. 2.next下一步下一步安装成功后弹出,点击ok就行. 2.再次运行webstorm快捷方式打开:界面如下: ...
- hive表查询中文显示乱码
hive在查询表信息时,中文显示乱码,数字或者url显现null问题解决思路. 1.确定create hive表时指定的row format delimited fields terminated b ...
- Dbshop v1.3任意用户密码重置漏洞
0x00 前言 年也过的差不多了,各自也都回到岗位忙碌起来了,新的一年祝大家诸事顺利,洞洞高危!好了进入正题 0x01 漏洞简介 本次主要写个简单的逻辑漏洞!然后抛个Message 内置高危. 1.找 ...
- python 模块路径查找 及 添加
**** python 模块路径查找: 通过模块的__file__属性来确定: **** 模块路径添加: 方法一:函数添加1 import sys2 查看sys.path3 添加sys.path.ap ...
- 【 C 】字符串常量
当一个字符串常量出现在表达式中时,它的值是个指针常量.编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针.但是,当数组名用于表达式中时,它们的值也是个指针常量.我们可以 ...
- 数据结构与算法之排序(3)插入排序 ——in dart
插入排序的思想比冒泡.选择要复杂,效率也比前两者更高.插入排序算法中运用了分治.逆向冒泡等思想,假设i之前的都是排好序的,i之后的都是待比较并排序的,然后逐次逆向向前比较,若小于前值,则将前值循环依次 ...
- win32api 找不到指定的模块
pywin32 安装后 import win32api 出现ImportError: DLL load failed: 找不到指定的模块 解决方法: 拷贝 C:\Python26\Lib\site-p ...