谈谈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 相关文章推荐
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
Oct 20 Javascript
用JS做的简单的可折叠的两级树形菜单
Sep 21 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
html的DOM中Event对象onblur事件用法实例
Jan 21 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
原生js实现简单的链式操作
Jul 04 Javascript
搭建element-ui的Vue前端工程操作实例
Feb 23 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
vue-cli3全面配置详解
Nov 14 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
Sep 16 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
分享php邮件管理器源码
2016/01/06 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
Python命名空间详解
2014/08/18 Python
web.py在模板中输出美元符号的方法
2014/08/26 Python
python3序列化与反序列化用法实例
2015/05/26 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Python中turtle库的使用实例
2019/09/09 Python
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
C#面试问题
2016/07/29 面试题
数控技术专业推荐信
2013/11/01 职场文书
中专生的个人自我评价
2013/12/11 职场文书
致400米运动员广播稿
2014/02/07 职场文书
租房协议书范本
2014/04/09 职场文书
我的梦想演讲稿
2014/04/30 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
事业单位考察材料范文
2014/12/25 职场文书
导游词范文
2015/02/13 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python