摘要:来之知乎林建入,作为一种优良的程序语言有很多特性,比如和结论结论所有判断都用而不用,除了判断,因为即将是的缩写。如果和的类型不同,那么一定会返回。除了判断,因为即将是的缩写。
来之知乎:林建入,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
假设要计算的是 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
从上面的算法流程可以看出,a === b 是最简单的。如果 a 和 b 的类型不同,那么一定会返回 false。而 a == b 则要灵活得多。JavaScript 会尝试调整 a 和 b 的类型,例如若 a 为字符串 b 为数字,则将字符串先转化为数字再与 b 比较,等等。
除了判断 x == null,因为即将 x == null 是 x === null || x === undefined 的缩写。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87436.html
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:面试题来源于网络,看一下高级前端的面试题,可以知道自己和高级前端的差距。 面试题来源于网络,看一下高级前端的面试题,可以知道自己和高级前端的差距。有些面试题会重复。 使用过的koa2中间件 koa-body原理 介绍自己写过的中间件 有没有涉及到Cluster 介绍pm2 master挂了的话pm2怎么处理 如何和MySQL进行通信 React声明周期及自己的理解 如何...
阅读 2849·2021-10-26 09:49
阅读 3181·2021-10-14 09:42
阅读 1963·2021-09-13 10:31
阅读 2532·2019-08-30 11:13
阅读 2922·2019-08-29 16:31
阅读 1025·2019-08-29 13:58
阅读 1819·2019-08-29 12:12
阅读 3511·2019-08-26 13:48