var x = { value: 0, toString () { this.value++; return this.value }, valueOf () { this.value++; return this.value } }
知识点解析:
一:== 与 === 的区别
== 允许在相等比较中进行强制类型转换,而 === 不允许。=== 比较的是值和类型,== 比较的时候,会做类型转换再比较值。
二:== 的类型转换
- ECMAScript规范中指出,a与b进行比较,如果a与b是Number,String,Boolean这三种类型中的一种,并且a与b的类型不同,那么就将a与b都转换成数字再进行比较;
- 如果a是Number,String,Boolean这三种类型中的一种,而b是一个复合对象时(Object,Array等),则对b执行ToPrimitive操作(这步是JS解释器执行的);
- ToPrimitive方法的实现,正是依次去调用对象的valueOf,toString方法,直到其中一个方法返回一个基本值,如果这两个方法没有返回基本值 ,那就认定不相等;
- valueOf 和 toString 的优先级:如果重写了两个属性,先执行重写的valueOf;如果只重写了一个属性,先执行被重写的属性;默认属性时,先执行valueOf。
三:执行方式
在 “x == 1 && x == 2 && x == 3”判断执行时,每次等式比较都会触发 valueOf、toString 方法,都会执行 value++ ,同时把最新的 value 值用于等式比较。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了