谈谈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 相关文章推荐
判断是否输入完毕再激活提交按钮
Jun 26 Javascript
jquery日历控件实现方法分享
Mar 07 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
Feb 21 Javascript
JS实现向iframe中表单传值的方法
Mar 24 Javascript
JS中关于正则的巧妙操作
Aug 31 Javascript
vue.js如何将echarts封装为组件一键使用详解
Oct 10 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
js取小数点后两位四种方法
Jan 18 Javascript
Vue实现数据请求拦截
Oct 23 Javascript
Vue请求java服务端并返回数据代码实例
Nov 28 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
mysql中存储过程、函数的一些问题
2007/02/14 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python内置函数OCT详解
2016/11/09 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
详解python算法之冒泡排序
2019/03/05 Python
使用Python实现分别输出每个数组
2019/12/06 Python
Python list运算操作代码实例解析
2020/01/20 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
canvas线条的属性详解
2018/03/27 HTML / CSS
C#笔试题
2015/07/14 面试题
linux面试题参考答案(9)
2015/01/07 面试题
护士工作失误检讨书
2014/09/14 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
机动车交通事故协议书
2015/01/29 职场文书
python文件目录操作之os模块
2021/05/08 Python