正题开始前我想先抛出一个问题,==和===有什么区别?可能一般人会想,不就是后者除了比较值相等之外还会比较类型是否相等嘛,有什么好问的,谁不知道?!但是这样说还不够准确,两者的真正区别其实是==在比较的时候允许做强制类型转换,而===不允许。好了终于引出了今天的重点,我们平时肯定遇到过强制类型转换的时候,死活想不通为什么要这样转换(为什么这两个相等)的情况。那么下面我就以==为例,来说明一下其中强制类型转换的规则。

前提知识

JavaScript中的6大类型:undefined、null、boolean、string、number、object
其中又分为:原始类型(Primitive) 和 对象类型(Object)

JavaScript中的假值:undefined、null、false、+0、-0、NaN和" "

1.字符串和数字相等比较

  1. 25 == "25" //true

第一种情况比较简单,当字符串和数字之间相等比较的时候,都会先将字符串强制转换成数字再比较

2.其他类型和布尔类型相等比较

  1. "25" == false //false
  2. "0" == false //true

第二种情况,当其他类型和布尔类型相等比较的时候,都会先将布尔类型强制转换为数字再比较。

右边的false强制转换为数字结果是0,然后再运用上面第一条规则,"0"强制转换为0,所以"0" == false返回的结果是true

3.对象和非对象相等比较

  1. "abc" == Object("abc"); //true
  2. null == Object(null); //false
  3. undefined == Object(undefined); //false
  4. 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(别问我为什么,这个是规定)

小检验

  1. false == "";
  2. false == [];
  3. "" == 0;
  4. "" == [];
  5. 0 == [];
  6. "" == [null];

看了之前的分析,检验一下吧,看看上面几个应该是true还是false呢?

总结

其实总结下来就三个口诀:

1.字符串类型和数字类型相等比较,字符串强转数字,再比较。

2.其他类型和布尔类型相等比较,布尔类型强转数字,再比较。

3.对象和非对象相等比较,执行ToPrimitive()操作,再比较。

有了这三个口诀(知道了转换原理),我相信任何情况我们都不再懵逼了。

写在最后

有一年没有更新博客了,回想一下,一是因为公司业务缠身,二是因为去年经历一些事情打击了我,其实这些也都是借口吧,最近看到强制类型转换这个方面有点绕,正好跟大家分享一下,希望之后能够坚持吧,多分享一些东西,对自己也是一种督促与进步吧。

最后感谢大家的阅读,有什么分析的不对的地方欢迎大家批评指出,如果喜欢本文,请点击右下角的推荐哦~

带你玩转JavaScript中的隐式强制类型转换的更多相关文章

  1. javascript中的隐式类型转化

    javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...

  2. JavaScript中关于隐式转换的一些总结

    JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类 ...

  3. JavaScript基础避免隐式的类型转换(004)

    JavaScript在普通对比运算符“==”执行时可能会进行隐式的类型转换.比如:false==0和""==0的结果都是true.同理也适合于"!="运算符.要 ...

  4. C语言隐式强制类型转换

    今天又被精度问题困扰,把最基本的东西忘了. int n = 5; int cnt = 5.5; double sum = (n-cnt);  运算完后sum是 -0.5.不知道什么时候n转换成doub ...

  5. Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  6. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

  7. 编写高质量代码改善C#程序的157个建议——建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理

    建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理 在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// <summary> /// 必须,防止程序员忘记 ...

  8. 也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)

    在上一篇文章也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强中,我提到了隐式数据类型转换添加对于数据分布非常不平均的表.评估的数据行数与实际值有非常大出入的问题,进一步測试之 ...

  9. 深入探究js中的隐式变量声明

    前两天遇到的问题,经过很多网友的深刻讨论,终于有一个相对可以解释的通的逻辑了,然后我仔细研究了一下相关的点,顺带研究了一下js中的隐式变量. 以下文章中提到的隐式变量都是指没有用var,let,con ...

随机推荐

  1. jQuery之scroll用法实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. activemq的高级特性:消息持久订阅

    activemq的高级特性之消息持久订阅 如果采用topic模式发送的时候,mq关闭了或消费者关闭了.在启动的时候,就会收不到mq发送的消息,所以就会出现消息持久订阅. 消息持久订阅:第一:消息要持久 ...

  3. cookie的简单认识

    1.cookie Cokie又叫会话跟踪技术,实际上就是客户端硬盘上的一个文本文件,该文件用来存储一些数据. 首先,HTTP请求时无状态的,也就是说,你打开一个网页和下一个网页之间没有任何关系,数据不 ...

  4. 浅谈es5和es6中的继承

    首先给大家介绍下在es5中构造函数的继承 function A(){ 2 //构造函数A 3 this.name="我是A函数"; 4 } 5 6 A.prototype={ 7 ...

  5. python教程(八)·文件操作

    由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解! 这次我们学习用python操作文件,包括文件的读.写等-- 操作文件第一步--打开文件 要想操作 ...

  6. 如何将M文件转成独立可执行程序

    如何将MATLAB程序编译成独立可执行的程序?生成独立可执行的程序(exe文件)步骤    1.安装编译器.可有多种选择,matlab自带了一个LCC,推荐使用VC++6.0,我基于VS 2013实现 ...

  7. 20+ Docs and Guides for Front-end Developers (No. 5)

    It’s that time again to choose the tool or technology that we want to brush up on. If you feel like ...

  8. SSM-CRUD入门项目——删除

    删除 分析 可以进行单个删除,直接点击每条记录后的删除按钮 批量删除,通过勾选checkbox框进行选择删除 单个删除: 通过发送DELETE请求的URL:/emp/{id} 这次我们先从contro ...

  9. 20155230 《Java程序设计》实验一(Java开发环境的熟悉) 实验报告

    练习题: 凯撒密码: import java.util.Scanner; import java.io.*; public class exp1 { public static void main(S ...

  10. ConfigurationManager 读写AppSettings键值对

    using System; using System.Configuration; namespace ConsoleApplication1 { class Program { static voi ...