谈谈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 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
JavaScript之HTMLCollection接口代码
Apr 27 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
javascript中expression的用法整理
May 13 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
Dec 08 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
Jan 16 Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 Javascript
浅谈Vue SSR中的Bundle的具有使用
Nov 21 Javascript
关于angular浏览器兼容性问题的解决方案
Jul 26 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 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框架Phpbean说明
2008/01/10 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
python实现大学人员管理系统
2019/10/25 Python
opencv python图像梯度实例详解
2020/02/04 Python
Python requests模块session代码实例
2020/04/14 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
简历的自我评价
2014/02/03 职场文书
青年文明号复核材料
2014/02/11 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
镇创先争优活动总结
2014/08/28 职场文书
矛盾论读书笔记
2015/06/29 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫