关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考
2024-09-30 01:25:47
看见这个面试题目,第一反应就是在变量a
取值时进行了一些改变,那就要用getter
,关于存取器的介绍可以看这里
var temp = 1;
Object.defineProperty(window, 'a', {
get: function() { // 每次取值,temp+1
return this.temp++
}
});
console.log( a === 1 && a === 2 && a === 3); // true
console.log(a) // 4
同样的问题是使 (a == 1 && a == 2 && a == 3)
返回true
,不同点是,这里是==
,而不再是===
。
===
恒等运算符在比较过程中,不会有任何类型转换;
==
相等运算符比较宽松,如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较。转换规则如下:
- 如果一个是
null
,一个是undefined
,则它们相等 - 如果一个是
数字
,一个是字符串
,先将字符串转换成数字,然后使用转换后的值进行比较 - 如果其中的一个值为
true
,则转换成1
再进行比较;如果其中一个值为false
,这转换成0
再进行比较 - 如果一个值是对象,另一个值是数字或者字符串,则将对象转换成原始值再进行比较。转换成字符串时,会先调用
toString()
,如果没有toString()
方法或者返回的不是一个原始值,则再调用valueOf()
,如果还是不存在或者返回不是原始值,则会抛出一个类型错误的异常。返回的原始值会被转换成字符串;如果转换成数字时,也是类似的,不过是会先调用valueOf()
,再调用toString()
,返回的原始值会被转换成数字 - 其他不同类型之间的比较均不相等
更详细的数据类型转换可以看 这里
回到题目中,除了第一种使用getter
的思路外,可以将a作为一个对象,而它的在比较中会转换成数字,所以可以重写valueOf()
方法,在每次取值的时候,进行一些处理。
let a = {
temp:1,
valueOf:function(){
return this.temp++
}
}
console.log(a == 1 && a == 2 && a == 3); // true
console.log(a) {temp:4,valueOf: f ()}
以上是关于这个问题的两种思路,当然还有还有我不知道的其他的做法,以后再补充
最新文章
- 十一个行为模式之迭代器模式(Iterator Pattern)
- ajax下载多文件,并且打包 C#中 ,文件批下载zip
- Linux主机共享目录给Windows主机的方法
- 关于WPF中RichTextBox失去焦点后如何保持高亮显示所选择的内容
- sso demo 取消https (cas)
- CentOS下crontab执行java程序
- hdu 2050:折线分割平面(水题,递归)
- (转)iOS动画Core Animation
- lightoj 1016
- Mongodb集群节点故障恢复场景分析
- 往xml中更新节点
- 深入理解JavaScript中的继承:原型链篇
- cas 单点登录(SSO)之一: jasig cas-server 安装
- 为什么有那么多人愿意喝";鸡汤";?
- ssm心得
- Spring再接触 简单属性注入
- SVPullToRefresh问题解决
- 微信分享缩略图,如何增加微信朋友圈分享链接的小图片? facebook、google+、twitter等分享的标签
- 洛谷 P4018 Roy&;October之取石子
- ie6 ie7 userdata 本地存储 引发的惨案.