写在前面
如果本文对您有所帮助,就请点个关注吧!
1. 首先,要记住null == undefined始终为true,这个暂时没有道理可言,记住就好了。
2. 然后看==前后有没有NaN,有的话都是返回false。NaN不等于任何值,包括其本身。
3. 布尔值会转成数字类型,true转成1,false转成0。
true == 1; // true
false == 0; // true
true == 2; //false
4. 数字和字符串比较,字符串会转换成数字。
"123" == 123; // true
"0" == 0; // true
"1a" == 1; // false,"1a"转成数字是NaN
5. undefined和null除了和undefined或null相等,和其他相比都是false
undefined == undefined; // true
undefined == false; // false
undefined == 0; // false
6. 数字或者字符串和对象相比,对象使用valueOf()或者toString()方法转换。
[] == false; // true
{} == false; // 报错
[] == 0; // true
[1] == 1; // true
7. ==等于运算符将原始值和其包装对象视为相等,但===全等运算符将它们视为不等。
var a = new Boolean(false);
a == 0; // true
ES5规范11.9.3抽象相等比较算法
比较运算x==y,其中x和y是值,产生true或者false。这样的比较如下方式进行:
- 若Type(x)与Type(y)相同,则
- 若Type(x)为Undefined,返回true。
- 若Type(x)为Null,返回true。
- 若Type(x)为Number,则
- 若x为NaN,返回false。
- 若y为NaN,返回false。
- 若x与y为相等数值,返回true。
- 若x为+0且y为-0,返回true。
- 若x为-0且y为+0,返回true。
- 返回false。
- 若Type(x)为String,则当x和y为完全相同的字符序列(长度相等且相同字符在相同位置)时返回true。否则,返回false。
- 若Type(x)为Boolean,当x和y为同为true或者同为false时返回true。否则,返回false。
- 当x和y为引用同一对象时返回true。否则,返回false。
- 若x为null且y为undefined,返回true。
- 若x为undefined且y为null,返回true。
- 若Type(x)为Number且Type(y)为String,返回comparison x == ToNumber(y)的结果。
- 若Type(x)为String且Type(y)为Number,返回比较ToNumber(x) == y的结果。
- 若Type(x)为Boolean,返回比较ToNumber(x) == y的结果。
- 若Type(y)为Boolean,返回比较x == ToNumber(y)的结果。
- 若Type(x)为String或Number,且Type(y)为Object,返回比较x == ToPrimitive(y)的结果。
- 若Type(x)为Object且Type(y)为String或Number,返回比较ToPrimitive(x) == y的结果。
- 返回false。
注:相等运算符不总是传递的。例如,两个不同的String对象,都表示相同的字符串值;==运算符认为每个String对象都与字符串值相等,但是两个字符串值对象互不相等。例如:
new String("a") == “a” 和 "a" == new String("a")皆为true。
new String("a") == new String("a")为false。
网友评论