网站首页 > 技术文章 正文
前言
在Javascript中判断相等有双等号(==)和三等号(===)两种,相信大家都知道三等号(===)是严格相等,而双等号(==)在判断相等的过程中会进行隐性转化。比如'1'==1就会返回true。
但是整个Javascript中使用双等号(==)判断相等的隐性转换机制,你都有全部了解吗?如果没有的话就刚好跟着我来一起看看吧。
Javascript
步骤1-是否有NaN
首先判断双等号两边是否有NaN,如果有的话,则一律返回false。
步骤1
步骤2-是否有boolean值
第二步,判断是否有布尔类型值,如果有的话则将true转化为1,false转化为0。
此时如果等号两边都是简单类型,可以直接进行判断。
步骤2
如果等号两边有对象或者数组类型,则需要先转化成简单类型,转换的过程看第三步。
步骤3-有一方是字符串
如果等号一边是字符串,另一边则要分以下几种情况:
同样是字符串,则直接进行字符串值的比较
是数字,则需要将字符串转化为数字,然后进行比较
有布尔类型,则要将布尔类型转化为0或则1,然后进行比较
对象或者数组类型,则需要调用toString()或者valueOf()方法转化成简单类型,然后进行比较
上述的前三条都很好理解,重点是第四条的toString()和valueOf()转化,这个我们在后面会具体讲到。
步骤4-null和undefined
遇到null或者undefined,则不会进行类型转换,它们相互的比较都返回true。
null和undefined
重点-toString()和valueOf()
很多人看到这两个方法的第一感觉就是,toString()方法将一个对象转化为字符串,valueOf方法将一个对象转化为数值。
这种想法很片面,我们通过以下两个例子来看看。
对象
定义一个obj对象,调用它的toString方法,返回值是[object Object],发现并未像我们想象的一样返回值其内容的字符串表示。
数组
定义一个数组arr,调用它的valueOf方法,返回值是[1, 2, 3],发现也并未像我们想象的一样返回数值类型的表示。
其实真正的理解是这样的:调用对象的toString()方法可以将对象转化为字符串,但是如果要转化为字符串不一定是调用toString方法。
我们再看看下面的代码。
代码1
上述代码1中我们定义了一个对象obj,定义了valueOf和toString方法的返回值,通过与1比较相等,发现其优先调用了valueOf方法。
然后定义了一个对象obj2,定义了valueOf和toString方法的返回值,通过与1比较相等,发现其调用的是toString方法。
然后我们看下面一段代码。
代码2
上述代码2中定义一个对象obj,通过与字符串'a'比较发现其调用的是valueOf方法。
然后对象obj2与'a'的比较返回false,发现其并未调用toString方法。
由此我们可以得出结论:
对象转化为简单类型时会优先调用valueOf方法,如果可以与简单值进行比较则会直接比较,此时不再调用toString方法。如果调用valueOf方法后无法与简单值进行比较,则会再调用toString方法,最终得到比对的结果。
但是需要注意的一点是Date对象不满足上述的规则,Date对象的toString和valueOf方法都是重新定义过的,默认会调用toString方法。
举例练习
以下是一些举例练习题,看看跟你想的答案都一样吗?
举例练习
结束语
本篇文章的知识点:Javascript中双等号隐性转换机制,你学会了吗?
感兴趣的同学可以加下我自己创建的Q群,大家相互学习交流,我也会尽力维护好群环境,群号如下所示。
群号
猜你喜欢
- 2024-11-01 Airbnb 开源力作:自动将 JavaScript 代码转换为 TypeScript
- 2024-11-01 JavaScript类型在什么情况下会发生类型自动转换
- 2024-11-01 js如何将接口get参数串转换成post格式输出
- 2024-11-01 【JS 字符转换】fromCharCode和charCodeAt
- 2024-11-01 几个JS开发小技巧,转换(js 开发)
- 2024-11-01 JavaScript将unicode编码转换为中文
- 2024-11-01 每日一题(js篇)通过js做进制转换(js 10进制转2进制)
- 2024-11-01 JavaScript-类型转换 224(javascript)
- 2024-11-01 基于Javascript编写的开源Markdown和HTML相互转换器——showdown
- 2024-11-01 一文读懂js中的隐式类型转换(js隐式调用)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)