可能大家平时大多使用(===),尽量避免了(==),但是在进行(>)和(<)的时候也会发生(==)同样的隐式转换,所以这个知识点是必须掌握的。

左值(x) 右值(y) 隐式处理
Number String ToNumber(y)
String Number ToNumber(x)
Boolean others ToNumber(x)
others Boolean ToNumber(y)
Object !Object Toprimitive(x)
!Object Object Toprimitive(y)

注意:此处的others表示其它基础类型

Toprimitive(Object)

​ 先返回valueOf()的值,若返回的不是基础类型的值,

​ 则返回toString()的值,若返回的不是基础类型的值,

​ 则抛出异常。

比较特殊的知识点

null和undefined单独出现与其他值进行比较不进行转换。

isNaN(Number(undefined))  //true
Number(null)===0  //true
Number("[空值或空值的组合]")===0  //true
复制代码
什么是空值?
  1. null
  2. (啥都没有)
  3. (Space空格)
  4. (空格的转义)
  5. (Tab缩进)
  6. \r
  7. \n
  8. \f
  9. \t
  10. 可能还有,我只知道这么多了

掌握以上知识点其实已经完全掌握在”==“的状况下的隐式转换了。

下面让我们来分析一下如何判断隐式转换

​ 首先,要纠正一下思维,(==)指可以进行强制类型转换的等于比较,隐式转换只是在双方属于不同类型的时候才会触发,遇到相同类型会直接比较。并且隐式转换具有阶段性,一会我们马上就会遇到。

​ 下面开始分析,看一下下面的例子

[] == 0; //true
复制代码

​ 看这个例子,它符合左值为”Object“,右值为”Number“的情况,所以进行Toprimitive([]),变为

"" == 0;
复制代码

​ 此时我们把这个结果叫做隐式转换的第一阶段结果,因为(==)两边的类型还是不相同,所以要再次进行隐式转换,现在它符合左值为“String”,右值为“Number的情况”,所以进行ToNumber(“”),根据上面所说的特殊知识点,变为

0 == 0;  //true
复制代码

​ 此时为第二阶段的结果,类型相同,进行比较。

​ 下面你可以试着自己分析一下下面的例子

[null] == 0;  //true
复制代码

​ 不要着急,让我们再来一个例子

[] == [null];  //false
复制代码

​ 啊???怎么回事,结果跟我们想像的好像不一样?既然([]==0)和([null]==0),难道根据这两个结果不应该是推导出([]==[null])嘛?原因在于你没有遵守我们分析的隐式转换原则,只有不同类型才会进行隐式转换,但是现在我们比较的两个值是相同的类型!

以上内容同样适用于(<)和(>)

​ 但是要注意(<=)和(>=),他在引擎中会被处理成不大于和不小于,如:

a<=b    --->    !(a>b)
复制代码

​ 为什么要说这点?试着输出下面的例子你就明白了

var a= {b:1};
var b= {b:2};console.log(a>b);  //false
console.log(a==b);  //false
console.log(a>=b);  //true
复制代码

转载于:https://juejin.im/post/5bf4dfe2518825490e0f799c

强制类型转换之(==)相关推荐

  1. 自动类型转换和强制类型转换

    自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...

  2. As与强制类型转换的区别以及Is运算符的使用

    前言: 开发人员经常需要将一个对象从一个类型转换成其他类型. 在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换 CLR(参考:http://bai ...

  3. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

  4. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  5. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  6. 《你不知道的JavaScript》整理(六)——强制类型转换

    JavaScript中通常分为两种类型转换,"隐式强制类型转换"(implicit coercion)和"显式强制类型转换"(explicit coercion ...

  7. C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)

    十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...

  8. static_cast与c风格的强制类型转换比较

    class A {int a; };class B {int b; };class C : public A {int c; };int main() {B b;C c;A* p1 = (A*) &a ...

  9. 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...

    一.字符串中单引号和双引号的使用: 1.字符串以英文单引号' '引用.eg:'Hello World' 2.若字符串中含有单引号,则以英文双引号" "引用.eg:"I'm ...

  10. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

最新文章

  1. ETC2 区别于ETC的重要点
  2. VTK:Snippets之RestoreSceneFromFieldData
  3. 关于z-index的一些问题
  4. 最近学习mpvue框架开发微信小程序,把wepy框架的项目实现到mpvue中,知道其中的一些两者之间的区别...
  5. lua mysql 事务_为什么在 Redis 实现 Lua 脚本事务?-阿里云开发者社区
  6. 置为底层_C语言之C语言的底层操作
  7. Table变量和临时表区别
  8. Vue导出excel文件
  9. python卡方拟合优度检验_如何使用Python中的科学库执行卡方拟合优度测试?
  10. 性能测试基础知识-测试指标(转载自阿里云)
  11. UE4开发学习笔记(双人游戏共享视角,共享相机)
  12. mysql数据库误删恢复
  13. Redis基础 -- 地理坐标类型 Redis GEO 和 Redis GEO的常用命令(含GEOHASH编码说明)
  14. Node.js 单页应用
  15. IDEA rebuild project idea如何重新编译项目
  16. Eclipse中java文件图标变成空心J如何解决
  17. 微信小程序在编辑器上样式正常,但在手机上不显示样式
  18. 【抓包工具】win 10 / win 11:WireShark 下载、安装、使用
  19. c语言据说一个人的标准体重应该是其身高,C/C++知识点之C语言第一次实验报告...
  20. Qalculate! 计算器 使用杂记

热门文章

  1. 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II
  2. XSD详解三 - 复合元素+总结篇
  3. java之设计模式工厂三兄弟之简单工厂模式
  4. Oracle11g数据库审计功能的关闭和开启
  5. SOFABoot 扩展点初体验 | SOFALab 实践系列
  6. 从虚拟主机时代说起,详述Kubernetes带来的变革
  7. Scala学习笔记(1)-环境搭建
  8. hadoop入门学习教程--DKHadoop完整安装步骤
  9. CCAI 2017 | 专访德国语言技术领军者 Hans Uszkoreit:深度学习还不足以解决 NLP 核心问题...
  10. 监控 MySQL的多种方法