谈谈JavaScript令人迷惑的==与+


Posted in Javascript onAugust 31, 2020

前言

相信很多学习过JavaScript的小伙伴都对JavaScript的==与+有一些疑惑,经常会出现结果与自己想象不一样的情况,而且也没找到一个通用的方法,只能死记硬背,非常难受。(咦,这不就是说的我嘛,嘻嘻嘻)今天就一起来揭开它们的神秘面纱,彻底解决掉他们。

正式开始之前,先来小试牛刀一下:

null == undefined;
 [] == [];
 '23'= 23;
 45 == [45];
 false == undefined;
 "" == [null];
 {} + {};
 false + 1

ToPrimitive函数

ToPrimitive是一个内部函数,用于处理类型转换,从字面意思就知道这个函数的就是将变量转化为基本类型的一个函数。

ToPrimitive(input, PreferredType)

第一个参数是 input,表示要转化的值;

第二个参数是PreferredType,表示希望转换成的类型,可为Number/String。

<p style="color:red">当input是日期类型时,PreferredType为String,其余情况下都相当于传入Number。</p>

当PreferredType传入参数时处理步骤会有差异,处理步骤分别如下:

1.PreferredType传入Number

(1). 如果input为基本类型,直接返回;

(2). 否则,调用valueOf方法,如果得到一个基本类值直接返回;

(3). 否则,调用toString方法,如果得到一个基本类值直接返回;

(4). 否则,JavaScript 抛出一个类型异常错误。

2.PreferredType传入String

(1). 如果input为基本类型,直接返回;

(2). 否则,调用toString方法,如果得到一个基本类值直接返回;

(3). 否则,调用valueOf方法,如果得到一个基本类值直接返回;

(4). 否则,JavaScript 抛出一个类型异常错误。

==

上述介绍了ToPrimitive函数,那么对于==的结果就能有一个清晰的认知。

我先给出一个判断逻辑,然后再以例子进行具体分析:

1.两边类型一致时,基本变量就直接进行值比较,相同则为true,不同则为false,引用变量如果两边都指向同一个内存地址那么返回true,否则返回false。

<p style="color:red">特别情况:</p>

null == undefined //true 可以理解为两值都为无效的值,所以内部认为并无不同,所以相等
 NaN == NaN //false
 //如果两个symbol变量不指向同一内存空间那么永为false,否则为true

2.两边类型不一致:

(1). 先调用ToPrimitive()返回基本类型;

(2). 若类型不一致,则调用ToNumber();( 这里的ToNumber也是一个内部函数,可将值转化为数字型 )

举两个例子吧:

false == undefined //true
 //false调用ToPrimitive返回false
 //undefined调用ToPrimitive返回undefined
 //false调用ToNumber返回0
 //undefined调用ToNumber返回0
45 == [45] //true
 //45调用ToPrimitive返回45
 //[45]调用ToPrimitive返回"45"
 //45调用ToNumber返回45
 //"45"调用ToNumber返回45

+

一元操作运算符+

+作为一元操作运算符逻辑比较简单:先调用ToPrimitive,后调用ToNumber

+['1'] //1
 //['1']调用ToPrimitive返回"1"
 //"1"调用ToNumber返回1
+{} //NaN
 //{}调用ToPrimitive返回"[object Object]"
 //"[object Object]"调用ToNumber返回NaN

二元操作运算符+

+作为二元操作运算符逻辑如下:

  1. 两个值分别调用ToPrimitive;
  2. 如果两个的返回值中有一个为字符串类型,则返回两个值toString的拼接结果;
  3. 否则返回toNumber相加的结果
null + 1 //1
 //null调用ToPrimitive返回null
 //1调用ToPrimitive返回1
 //null调用ToNumber返回0
 //1调用ToNumber返回1
 //0 + 1 = 1
[1, 2] + [3, 4] //"1,23,4"
 //[1, 2]调用ToPrimitive返回"1,2"
 //[3, 4]调用ToPrimitive返回"3,4"
 //"1,2"调用toString返回"1,2"
 //"3,4"调用toString返回"3,4"
 //"1,2" + "3,4" = "1,23,4"

以上就是谈谈JavaScript令人迷惑的==与+的详细内容,更多关于JavaScript ==和+的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript DOM 学习第二章 编辑文本
Feb 19 Javascript
jquery中动态效果小结
Dec 16 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
Nov 26 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
JavaScript实战(原生range和自定义特效)简单实例
Aug 21 Javascript
关于JavaScript中forEach和each用法浅析
Jul 27 Javascript
vue watch监听对象及对应值的变化详解
Feb 24 Javascript
JavaScript实现微信号随机切换代码
Mar 09 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 jQuery
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
Dec 10 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 #Javascript
JS性能优化实现方法及优点进行
Aug 30 #Javascript
如何检测JavaScript中的死循环示例详解
Aug 30 #Javascript
JavaScript中CreateTextFile函数
Aug 30 #Javascript
详解vue组件之间的通信
Aug 30 #Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 #Javascript
JavaScript事件委托实现原理及优点进行
Aug 29 #Javascript
You might like
SONY ICF-SW55的电路分析
2021/03/02 无线电
thinkphp浏览历史功能实现方法
2014/10/29 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
JavaScript浏览器选项卡效果
2010/08/25 Javascript
模拟select的代码
2011/10/19 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
Python实现的字典值比较功能示例
2018/01/08 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
视光学专业毕业生推荐信
2013/10/28 职场文书
迎接领导欢迎词
2014/01/11 职场文书
毕业生就业意向书
2014/04/01 职场文书
法人授权委托书样本
2014/09/19 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
安全检查汇报材料
2014/12/26 职场文书