你不知道的 JavaScript 系列中( 30 ) - 比较中的强制转换类型
var a = [ 42 ]; var b = [ "43" ]; a < b; // true b < a; // false
比较双方首先调用 ToPrimitive,如果结果出现非字符串,就根据 ToNumber 规则将双方强 制类型转换为数字来进行比较
var a = [ "42" ]; var b = [ "043" ]; a < b; // false
如果比较双方都是字符串,则按字母顺序来进行比较:
var a = [ 4, 2 ]; var b = [ 0, 4, 3 ]; a < b; // false
a转换为"4, 2",b转换为"0, 4, 3",同样是按字母顺序进行比较。
var a = { b: 42 }; var b = { b: 43 }; a < b; // false a == b; // false a > b; // false a <= b; // true a >= b; // true
如果a < b和a == b结果为false,为什么a <= b和a >= b的结果会是true呢? 因为根据规范a <= b被处理为b < a,然后将结果反转。因为b < a的结果是false,所以a <= b的结果是true。
这可能与我们设想的大相径庭,即 <= 应该是“小于或者等于”。实际上 JavaScript 中 <= 是
“不大于”的意思(即!(a > b),处理为!(b < a))。同理a >= b处理为b <= a。
为了保证安全,应该对关系比较中的值进行显式强制类型转换:
var a = [ 42 ]; var b = "043"; a < b; // false -- 字符串比较! Number( a ) < Number( b ); // true -- 数字比较!
分类:
JavaScript基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-11-28 React源码 Suspense 和 ReactLazy
2019-11-28 React源码 ConcurrentMode
2018-11-28 创建一个最简单的服务
2018-11-28 http报文
2017-11-28 事件(三):事件对象
2017-11-28 事件(二):事件处理程序