谈谈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 相关文章推荐
Js点击弹出下拉菜单效果实例
Aug 12 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
Sep 11 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
javascript数据类型验证方法
Dec 31 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
vue-router 中router-view不能渲染的解决方法
May 23 Javascript
用p5.js制作烟花特效的示例代码
Mar 21 Javascript
VeeValidate在vue项目里表单校验应用案例
May 09 Javascript
解决angular2 获取到的数据无法实时更新的问题
Aug 31 Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 Javascript
JavaScript 对象创建的3种方法
Nov 17 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
递归列出所有文件和目录
2006/10/09 PHP
附件名前加网站名
2008/03/23 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
JS图片定时翻滚效果实现方法
2016/06/21 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
python比较两个列表是否相等的方法
2015/07/28 Python
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python离线安装外部依赖包的实现
2020/02/13 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
家长会学生家长演讲稿
2013/12/29 职场文书
西式婚礼主持词
2014/03/13 职场文书
施工员岗位职责
2014/03/16 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
学生检讨书
2015/01/27 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书