Closed iugo closed 4 years ago
===
==
如果两值类型相等, 则两种对比没有区别. == 的主要功能是隐性地类型转换.
如果一个为 Number 另一个为 String, 则将 String 转为 Number 类型进行对比.
Number
String
如果任意一个为 Boolean, 则将 Boolean 转为 Number 类型进行对比.
Boolean
如果任意一个为 Object, 则调用 .toString() 转类型.
Object
.toString()
转为 Number 类型时, 需要注意: true => 1, false => +0, null => +0.
true => 1, false => +0, null => +0
总结如下:
true
1
false
+0
依据上面的规则, 我们可以得到以下结果.
null == undefined; "[object Object]" == {}; 1 == true; 2 !== true; 0 == false; -1 !== false; NaN == "NaN"; !({} == true); !({} == false);
有些是我们想要的, 但有些不是. 因为这种类型转换的复杂性, 不建议使用 ==.
主要区别在于是否区分 -0 与 +0. SameValue 区分, SameValueZero 则不区分.
-0
这是历史遗留问题, 我们一般不会直接遇到该问题.
主要区别在于是否区分两个 NaN, === 区分, SameValueZero 则不区分.
NaN
整个 Assignment Operators 比较复杂, 简单说运算符右侧使用的 GetValue.
如果不是引用类型, 则只是返回该值就好.
如果是引用类型, 则将该值复制. 如果右侧为对象, 则创建该值的引用.
概念:
应用:
tags: ECMAScript
sameness, deep equal, immutable
相等
===
严格相等==
大概相等===
与==
的区别如果两值类型相等, 则两种对比没有区别.
==
的主要功能是隐性地类型转换.如果一个为
Number
另一个为String
, 则将String
转为 Number 类型进行对比.如果任意一个为
Boolean
, 则将Boolean
转为 Number 类型进行对比.如果任意一个为
Object
, 则调用.toString()
转类型.转为 Number 类型时, 需要注意:
true => 1, false => +0, null => +0
.总结如下:
true
1
false
+0
依据上面的规则, 我们可以得到以下结果.
有些是我们想要的, 但有些不是. 因为这种类型转换的复杂性, 不建议使用
==
.SameValueZero 与 SameValue 的区别
主要区别在于是否区分
-0
与+0
. SameValue 区分, SameValueZero 则不区分.这是历史遗留问题, 我们一般不会直接遇到该问题.
===
与 SameValueZero 的区别主要区别在于是否区分两个
NaN
,===
区分, SameValueZero 则不区分.赋值
整个 Assignment Operators 比较复杂, 简单说运算符右侧使用的 GetValue.
如果不是引用类型, 则只是返回该值就好.
如果是引用类型, 则将该值复制. 如果右侧为对象, 则创建该值的引用.
深度对比与不可变值
概念:
应用:
tags: ECMAScript