前言
置信很多学习过 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 传入参数时解决步骤会有差别,解决步骤别离如下:
- PreferredType 传入 Number
(1). 如果 input 为根本类型,间接返回;
(2). 否则,调用 valueOf 办法,如果失去一个根本类值间接返回;
(3). 否则,调用 toString 办法,如果失去一个根本类值间接返回;
(4). 否则,JavaScript 抛出一个类型异样谬误。
- PreferredType 传入 String
(1). 如果 input 为根本类型,间接返回;
(2). 否则,调用 toString 办法,如果失去一个根本类值间接返回;
(3). 否则,调用 valueOf 办法,如果失去一个根本类值间接返回;
(4). 否则,JavaScript 抛出一个类型异样谬误。
==
上述介绍了 ToPrimitive 函数,那么对于 == 的后果就能有一个清晰的认知。
我先给出一个判断逻辑,而后再以例子进行具体分析:
- 两边类型统一时,根本变量就间接进行值比拟,雷同则为 true,不同则为 false,援用变量如果两边都指向同一个内存地址那么返回 true,否则返回 false。
<p style=”color:red”> 特地状况:</p>
null == undefined //true 能够了解为两值都为有效的值,所以外部认为并无不同,所以相等
NaN == NaN //false
// 如果两个 symbol 变量不指向同一内存空间那么永为 false,否则为 true
- 两边类型不统一:
(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
二元操作运算符 +
+ 作为二元操作运算符逻辑如下:
- 两个值别离调用 ToPrimitive;
- 如果两个的返回值中有一个为字符串类型,则返回两个值 toString 的拼接后果;
- 否则返回 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"