首先,看一个问题
var a = prompt();
if(a == 10)a+=1
console.log(a);
输入 a 为10,然后看结果 字符串类型的101
为了避免以后工作出错让自己蒙蔽半天浪费时间,在未工作之前先了解一下“= =”与’= = =’
= =(Equals Operator——等号运算符)
假设有表达式 a = = b,则它的实际运算过程如下
- 计算出表达式 a 的结果,并存入 lref 变量
- 将 GetValue(lref) 的结果存入 lval 变量
- 计算出表达式 b 的结果,并存入 rref 变量
- 将 GetValue(rref) 的结果存入 rval 变量
- 执行 Abstract Equality Comparison 算法判断 rval = = lval 并将结果直接返回
Abstract Equality Comparison(抽象相等比较):
用上面的例子 a = = b(a,b为具体值)
1、 如果x和y的数据类型相同:
- 如果 x、y 为 Number:
1.2.1. 如果 x或y 是 NaN,返回 false
1.2.2. 如果 x 的数值与 y 相同,返回 true
1.2.3. 如果 x 是 ±0 且 y 是 ±0,返回 true
否则返回false - 如果 x 、 y 为 String,则当且仅当 x 与 y 的字符序列完全相同(长度相等,每个位置上的字符相同)时返回 true,否则返回 false
- 如果 x 、 y 为 Boolean,则若 x 与 y 同为 true 或同为 false 时返回 true,否则返回 false
- 如果 x 和 y 引用的是同一个对象,返回 true,否则返回 false
2、 如果 x 为null或undefined且y为null或undefined 返回 true
3、如果 x、y任意一方 String,且另一方为Number。则尝试把String转化为Number——比较结果作为返回
4、 如果 x或y任意一方 为 Boolean,则尝试把Boolean转化为Number——比较结果作为返回值
5、 如果 x 为 String 或 Number 且 y 为 Object
或x 为 Object 且 y 为 String 或 Number
则把Object类型转为另一个的类型(String或者Number) ——比较结果作为返回值
不满足上述条件则返回 false
总结:
- 如果两边内容完全相同则返回true(null可以等于undefined)——NaN除外为false
不相同时: - 如果两边均不是Object类型,则尽量转化为Number进行比较
- 如果碰到有一边为Object类型另一边为基本类型,则转化为另一边的类型再作比较
- 如果两边都为Object则比较引用地址
而
=== Strict Equals Operator 严格等号运算符
就比较简单了
运行流程和等号运算符基本一样,不过调用的算法有点细微区别
- 两边数据类型不同直接false(1 = = = true //false)——数据类型要相同(null = = =undefined //false)
- 只要有一方NaN直接false
- 字符串比较字符长度和字符内容,两点有一点不同直接false
- object比较引用地址,地址不同直接false
数据类型相同,然后数据内容完全相同才返回true
参考:
知乎林建入回答= =与= = =