JS中两个值是否相等&类型转换

类型转换

也可以参考官方版类型转换

转为String

  1. undefined null true false 均转换为相应的字符串:“undefined”等
  2. 数值:+0和-0转为“0”;NaN、Infinity、-Infinity均转换为相应的字符串
  3. 对象对有toString()方法,则直接调用。否则,尝试调用valueOf()。否则返回类型错误异常。
    toString()方法:数组返回逗号隔开的数组字符串;函数可以返回函数的字符串;Date、TegExp也可以返回。普通的object({x:1,y:2})返回[object object]。

转为Number

  1. undefined转为NaN,null转为+0
  2. true为1,false为0
  3. “”为0;”1.2”转为1.2;”one”转为NaN;其他的看下面具体规则
  4. 如果为对象。先转换为原始值,再转换为数值。[]转为0;[9]转为0,其他基本都是NaN;

转为Boolean

  1. undefined null “” 0 -0 NaN 转为false
  2. 其他的转为true(包括[]、{})

ES5和ES6中的比较相等的运算符

在ES5中,只有两个运算符:相等运算符(==)和严格相等运算符(===)。在ES6中,则新增了一个中比较相等的方法Object.is()。
相等运算符会自动转换数据类型,而严格相等运算符不会。但是,根据严格相等运算符,NaN不等于NaN,+0等于-0。
ES6的Object.is()提出“Same-value equality”(同值相等)算法,以解决上述问题。其用来比较两个值是否严格相等,与严格比较运算符的行为基本一致。

三个方法的比较及结果

下列的步骤,是有顺序的,如满足1,则不会使用2.

相等比较步骤

  1. 如果两个值类型相同,返回严格相等(===)的结果。
  2. null和undefined返回true
  3. 一个为Number,一个为String,将String转为Number;
  4. 布尔类型转换为Number比较
  5. 一个为String/Number/Boolean,另一个为object,则将object转换,进行比较;
    总结:有Number类型,则将另外一个值转为Number进行比较。Boolean转为Number。一个为object则转换为原始值进行比较。

严格相等比较步骤

  1. 类型不相同,返回false
  2. null等于null,undefined等于undefined
  3. NaN不等于任何数,包括自身;两个数值相同,返回true;+0等于-0;其他false
  4. 为String,完全相等,返回true
  5. true等于true,false等于false;
  6. 相同的Symbol值(Symbol.for(‘f’),Symbol.for(‘f’)),返回true;
  7. 相同的object,则返回true。
  8. 返回false;

Object.is()比较步骤

  1. Type(x)和Type(y)不同,返回false
  2. Type(x)为null或undefined,返回true(null等于null,undefined等于undefined)
  3. Type(x)为数字。NaN等于NaN;+0不等-0;相同数字相等;正/负无穷不等于正/负无穷;
  4. Type(x)为string,两个值为相同的序列单元返回true,否则返回false;
  5. Type(x)为Boolean,true等于true,false等于false;
  6. Type(x)为Symbol,相同的Symbol值,返回true;
  7. x和y是相同的object值,返回true,否则返回false({}不等于{})。

一些特殊值的比较

值1 值2 == === Object.is()
类型不同 转换 false false
null undefined true false false
null null true true true
undefined undefined true true true
NaN NaN false false true
+0 -0 true true false
-Infinity -Infinity true true true
“12345” “12345” true true true
false false true true true
Symbol(‘f’) Symbol.for(‘f’) false false false
Symbol.for(‘f’) Symbol.for(‘f’) true true true
object object(引用相同) true true true
{} {} (引用不同) false false false

参考链接及书籍

ECMAScript2015 官方语法
JavaScript中文版