看见这个面试题目,第一反应就是在变量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,不同点是,这里是==,而不再是===

===恒等运算符在比较过程中,不会有任何类型转换

==相等运算符比较宽松,如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较。转换规则如下:

  1. 如果一个是null,一个是undefined,则它们相等
  2. 如果一个是数字,一个是字符串,先将字符串转换成数字,然后使用转换后的值进行比较
  3. 如果其中的一个值为true,则转换成1再进行比较;如果其中一个值为false,这转换成0再进行比较
  4. 如果一个值是对象,另一个值是数字或者字符串,则将对象转换成原始值再进行比较。转换成字符串时,会先调用toString(),如果没有toString()方法或者返回的不是一个原始值,则再调用valueOf(),如果还是不存在或者返回不是原始值,则会抛出一个类型错误的异常。返回的原始值会被转换成字符串;如果转换成数字时,也是类似的,不过是会先调用valueOf(),再调用toString(),返回的原始值会被转换成数字
  5. 其他不同类型之间的比较均不相等

更详细的数据类型转换可以看 这里

回到题目中,除了第一种使用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 ()}

以上是关于这个问题的两种思路,当然还有还有我不知道的其他的做法,以后再补充

最新文章

  1. 十一个行为模式之迭代器模式(Iterator Pattern)
  2. ajax下载多文件,并且打包 C#中 ,文件批下载zip
  3. Linux主机共享目录给Windows主机的方法
  4. 关于WPF中RichTextBox失去焦点后如何保持高亮显示所选择的内容
  5. sso demo 取消https (cas)
  6. CentOS下crontab执行java程序
  7. hdu 2050:折线分割平面(水题,递归)
  8. (转)iOS动画Core Animation
  9. lightoj 1016
  10. Mongodb集群节点故障恢复场景分析
  11. 往xml中更新节点
  12. 深入理解JavaScript中的继承:原型链篇
  13. cas 单点登录(SSO)之一: jasig cas-server 安装
  14. 为什么有那么多人愿意喝"鸡汤"?
  15. ssm心得
  16. Spring再接触 简单属性注入
  17. SVPullToRefresh问题解决
  18. 微信分享缩略图,如何增加微信朋友圈分享链接的小图片? facebook、google+、twitter等分享的标签
  19. 洛谷 P4018 Roy&October之取石子
  20. ie6 ie7 userdata 本地存储 引发的惨案.

热门文章

  1. Echarts 柱状图属性详解
  2. PHP安装linux
  3. MYSQL 时间类型
  4. AFNetWorking 源码粗浅理解
  5. vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)
  6. pythone函数基础(9)操作数据库连接
  7. android nostra13
  8. 6J - 盐水的故事
  9. C++字符串结束标识
  10. 选择困难症的福音——团队Scrum冲刺阶段-Day5(补发 那天csshow)