强制类型转换之(==)
可能大家平时大多使用(===),尽量避免了(==),但是在进行(>)和(<)的时候也会发生(==)同样的隐式转换,所以这个知识点是必须掌握的。
左值(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
复制代码
什么是空值?
- null
- (啥都没有)
- (Space空格)
- (空格的转义)
- (Tab缩进)
- \r
- \n
- \f
- \t
- 可能还有,我只知道这么多了
掌握以上知识点其实已经完全掌握在”==“的状况下的隐式转换了。
下面让我们来分析一下如何判断隐式转换
首先,要纠正一下思维,(==)指可以进行强制类型转换的等于比较,隐式转换只是在双方属于不同类型的时候才会触发,遇到相同类型会直接比较。并且隐式转换具有阶段性,一会我们马上就会遇到。
下面开始分析,看一下下面的例子
[] == 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
强制类型转换之(==)相关推荐
- 自动类型转换和强制类型转换
自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...
- As与强制类型转换的区别以及Is运算符的使用
前言: 开发人员经常需要将一个对象从一个类型转换成其他类型. 在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换 CLR(参考:http://bai ...
- 重载new、delete和强制类型转换运算符()
1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...
- C++中的向上类型转换和向下类型转换+四种强制类型转换
转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...
- 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]
一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示: 值 ...
- 《你不知道的JavaScript》整理(六)——强制类型转换
JavaScript中通常分为两种类型转换,"隐式强制类型转换"(implicit coercion)和"显式强制类型转换"(explicit coercion ...
- C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)
十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...
- 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 ...
- 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...
一.字符串中单引号和双引号的使用: 1.字符串以英文单引号' '引用.eg:'Hello World' 2.若字符串中含有单引号,则以英文双引号" "引用.eg:"I'm ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
最新文章
- ETC2 区别于ETC的重要点
- VTK:Snippets之RestoreSceneFromFieldData
- 关于z-index的一些问题
- 最近学习mpvue框架开发微信小程序,把wepy框架的项目实现到mpvue中,知道其中的一些两者之间的区别...
- lua mysql 事务_为什么在 Redis 实现 Lua 脚本事务?-阿里云开发者社区
- 置为底层_C语言之C语言的底层操作
- Table变量和临时表区别
- Vue导出excel文件
- python卡方拟合优度检验_如何使用Python中的科学库执行卡方拟合优度测试?
- 性能测试基础知识-测试指标(转载自阿里云)
- UE4开发学习笔记(双人游戏共享视角,共享相机)
- mysql数据库误删恢复
- Redis基础 -- 地理坐标类型 Redis GEO 和 Redis GEO的常用命令(含GEOHASH编码说明)
- Node.js 单页应用
- IDEA rebuild project idea如何重新编译项目
- Eclipse中java文件图标变成空心J如何解决
- 微信小程序在编辑器上样式正常,但在手机上不显示样式
- 【抓包工具】win 10 / win 11:WireShark 下载、安装、使用
- c语言据说一个人的标准体重应该是其身高,C/C++知识点之C语言第一次实验报告...
- Qalculate! 计算器 使用杂记
热门文章
- 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II
- XSD详解三 - 复合元素+总结篇
- java之设计模式工厂三兄弟之简单工厂模式
- Oracle11g数据库审计功能的关闭和开启
- SOFABoot 扩展点初体验 | SOFALab 实践系列
- 从虚拟主机时代说起,详述Kubernetes带来的变革
- Scala学习笔记(1)-环境搭建
- hadoop入门学习教程--DKHadoop完整安装步骤
- CCAI 2017 | 专访德国语言技术领军者 Hans Uszkoreit:深度学习还不足以解决 NLP 核心问题...
- 监控 MySQL的多种方法