谈谈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 URL参数判断,确定菜单样式
May 31 Javascript
javascript时间函数基础介绍
Mar 28 Javascript
JavaScript定时器详解及实例
Aug 01 Javascript
javascript属性访问表达式用法分析
Apr 25 Javascript
Javascript基础学习笔记(菜鸟必看篇)
Jul 22 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
Jan 16 Javascript
JS利用prototype给类添加方法操作详解
Jun 21 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
Nov 25 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 Javascript
详细分析React 表单与事件
Jul 08 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+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
大学生通用个人的自我评价
2014/02/10 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
母亲节主题班会
2015/08/14 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
外出考察学习心得体会
2016/01/18 职场文书
学生检讨书范文
2019/06/24 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
Linux安装Docker详细教程
2022/07/07 Servers