谈谈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或者jquery判断图片是否加载完成实现代码
Mar 20 Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 Javascript
javascript使用prototype完成单继承
Dec 24 Javascript
jQuery匹配文档链接并添加class的方法
Jun 26 Javascript
jQuery实现的分子运动小球碰撞效果
Jan 27 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
javascript 单例模式详解及简单实例
Feb 14 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
vue拖拽组件使用方法详解
Dec 01 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
Jul 18 Javascript
浅谈TypeScript 索引签名的理解
Oct 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
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
python多线程方式执行多个bat代码
2016/06/07 Python
Python如何生成树形图案
2018/01/03 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
高二物理教学反思
2014/02/08 职场文书
有创意的广告词
2014/03/18 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
导游词之无锡梅园
2019/11/28 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript