JS中 === 和 == 的区别

来之知乎:林建入,https://www.zhihu.com/questio...

Javascript作为一种“优良”的程序语言有很多特性,比如 == 和 ===

1 结论

结论:所有判断都用=== 而不用 == ,除了判断 x == null,因为即将 x == null 是 x === null || x === undefined 的缩写。

2 ===

被称为 Strict Equals Operator,假设有表达式 a === b,则它的实际运算过程如下
1 计算出表达式 a 的结果,并存入 lref 变量
2 将 GetValue(lref) 的结果存入 lval 变量
3 计算出表达式 b 的结果,并存入 rref 变量
4 将 GetValue(rref) 的结果存入 rval 变量
执行 Strict Equality Comparison 算法判断 rval === lval 并将结果直接返回
这里的 Strict Equality Comparison 算法很关键,假设要计算的是 x === y,则过程如下
1 如果 Type(x) 和 Type(y) 不同,返回 false
2 如果 Type(x) 为 Undefined,返回 true
3 如果 Type(x) 为 Null,返回 true
4 如果 Type(x) 为 Number,则进入下面的判断逻辑
4-1 如果 x 为 NaN,返回 false
4-2 如果 y 为 NaN,返回 false
4-3 如果 x 的数字值和 y 相等,返回 true
4-4 如果 x 是 +0 且 y 是 -0,返回 true
4-5 如果 x 是 -0 且 y 是 +0,返回 ture
4-6 返回 false
5 如果 Type(x) 为 String,则当且仅当 x 与 y 的字符序列完全相同(长度相等,每个位置上的字符相同)时返回 true,否则返回 false
6 如果 Type(x) 为 Boolean,则若 x 与 y 同为 true 或同为 false 时返回 true,否则返回 false
7 如果 x 和 y 引用的是同一个对象,返回 true,否则返回 false

3 ==

假设要计算的是 x == y,Abstract Equality Comparison 计算的过程如下(很冗长,但是每个步骤都很简单)
1 如果 Type(x) 和 Type(y) 相同,则
1.1 如果 Type(x) 为 Undefined,返回 true
1.2 如果 Type(x) 为 Null,返回 true
1.3 如果 Type(x) 为 Number,则
1.3.1 如果 x 是 NaN,返回 false
1.3.2 如果 y 是 NaN,返回 false
1.3.3 如果 x 的数值与 y 相同,返回 true
1.3.4 如果 x 是 +0 且 y 是 -0,返回 true
1.3.5 如果 x 是 -0 且 y 是 +0,返回 true
1.3.6 返回 false
1.4 如果 Type(x) 为 String,则当且仅当 x 与 y 的字符序列完全相同(长度相等,每个位置上的字符相同)时返回 true,否则返回 false
1.5 如果 Type(x) 为 Boolean,则若 x 与 y 同为 true 或同为 false 时返回 true,否则返回 false
1.6 如果 x 和 y 引用的是同一个对象,返回 true,否则返回 false
2 如果 x 是 null 且 y 是 undefined,返回 true
3 如果 x 是 undefined 且 y 是 null,返回 ture
4 如果 Type(x) 为 Number 且 Type(y) 为 String,以 x == ToNumber(y) 的比较结果作为返回
5 如果 Type(x) 为 String 且 Type(y) 为 Number,以 ToNumber(x) == y 的比较结果作为返回值
6 如果 Type(x) 为 Boolean,以 ToNumber(x) == y 的比较结果作为返回值
7 如果 Type(y) 为 Boolean,以 x == ToNumber(y) 的比较结果作为返回值
8 如果 Type(x) 为 String 或 Number 且 Type(y) 为 Object,以 x == ToPrimitive(y) 的比较结果作为返回值
9 如果 Type(x) 为 Object 且 Type(y) 为 String 或 Number,以 ToPrimitive(x) == y 的比较结果作为返回值10. 返回 false

4 总结

从上面的算法流程可以看出,a === b 是最简单的。如果 a 和 b 的类型不同,那么一定会返回 false。而 a == b 则要灵活得多。JavaScript 会尝试调整 a 和 b 的类型,例如若 a 为字符串 b 为数字,则将字符串先转化为数字再与 b 比较,等等。
除了判断 x == null,因为即将 x == null 是 x === null || x === undefined 的缩写。


大杂烩
所学甚杂

教育皆祸害,[链接]

2k 声望
221 粉丝
0 条评论
推荐阅读
人工智能/大数据就业前景及优劣势分析
总述 职位少,要求高,人工智能落地困难,决定了就业可能会是一个大问题 全国范围内的人工智能的职位是183 而Java是10000+ (因lagou并不展示总数,因此该数据从请求分析而来) 因此岗位数量与Java大概是60倍的差距...

方老司1阅读 5.8k

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城31阅读 7.2k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco20阅读 2.1k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...

边城18阅读 7.7k评论 3

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.9k评论 9

教育皆祸害,[链接]

2k 声望
221 粉丝
宣传栏