看见这个面试题目,第一反应就是在变量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 ()}

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

关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考的更多相关文章

  1. 笔记《JavaScript 权威指南》(第6版) 分条知识点概要3—表达式和运算符

    [表达式和运算符]原始表达式,初始化表达式(对象和数组的),函数定义表达式,属性访问表达式,调用表达式,对象创建表达式,运算符概述,算术表达式,关系表达式,逻辑表达式,赋值表达式,表达式计算,其他运算 ...

  2. LeetCode算法题(长期更新)

    1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...

  3. python多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)

    摘录python核心编程 一般的,多线程代码中,总有一些特定的函数或者代码块不希望(或不应该)被多个线程同时执行(比如两个线程运行的顺序发生变化,就可能造成代码的执行轨迹或者行为不相同,或者产生不一致 ...

  4. 如何使用 Set 来提高JS代码的性能

    摘要: 高效使用Set! 作者:前端小智 原文:如何使用 Set 来提高代码的性能 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 我确信有很多开发人员坚持使 ...

  5. ES6 Set和Map的那点事

    Set  1.Set特点 类数组 新增数据结构 是构造函数 成员值唯一  注重独一无二的特征 2.Set实例的常用方法 console.log('------------Set操作方法-------- ...

  6. fstream对象重复使用时注意clear()的调用

    fstream对象重复使用时注意clear()的调用,否则会造成打开第二个文件失败.这是因为一个fstream对象对应磁盘上的一个文件,这种绑定关系在调用open()函数或者构造函数时指定,但有时我们 ...

  7. 一道C语言面试题:判断字串是否可以通过重新排列字母使之对称

    题目:输入一个字符串,如“adcaeceeed”,判断是否可以通过重新排列使之可以输出对称字符串,如本例可以输出“adceeeecda”,返回True. 来源:某500强企业面试题目 思路:扫描字串, ...

  8. GridLayout 可使容器中的各个组件呈网格状布局

    GridLayout 可使容器中的各个组件呈网格状布局,平局占据容器的空间,即使容器的大小发生变化,每个组件还是平均占据容器的空间. 和FlowLayout一样,GridLayout也是按照从上到下, ...

  9. 用BSF + Beanshell使Java程序能够运行字符串形式的代码(转载)

    BSF(Bean Scripting Framework)最初是IBM Alpha工作组的项目,后来贡献给了Apache,BSF使Java能够更好的与各种流行脚本语言整合,实现不同语言之间的交互功能. ...

随机推荐

  1. 初学c# -- 纯属无聊,写下棋

    纯属无聊了,会下的棋都做了. 象棋围棋修改用法都一样. 1.先启动服务端 goServer.exe服务端:地址为IPAddress[] addrIP = Dns.GetHostAddresses(&q ...

  2. oday获取系统最高权限的代码

    import sys,sockettarget = sys.argv[1]shellcode = ("\x6a\x4f\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81 ...

  3. Oracle导出csv时数字不变成科学计数法

    导出成CSV后,用excel打开,点击excel的[数据]→[自文本],选择导出的csv文件,下一步,分隔符选择[逗号],下一步,选择所有列“按住shift+鼠标左键选取”后,列数据格式选文本,[完成 ...

  4. object references an unsaved transient instance save the transient instance before flushing

    object references an unsaved transient instance save the transient instance before flushing 对象引用未保存的 ...

  5. spring 自定义标签的实现

    在我们进行Spring 框架开发中,估计用到最多的就是bean 标签吧,其实在Spring中像<mvc/><context/>这类标签以及在dubbo配置的标签都是属于自定义的 ...

  6. face_recognition 模块安装

    https://blog.csdn.net/qq_15192373/article/details/78623741 https://blog.csdn.net/roguesir/article/de ...

  7. Linux下搭建ftp服务

    Linux下ftp服务可以通过搭建vsftpd服务来实现,以CentOS为例,首先查看系统中是否安装了vsftpd,可以通过执行命令 rpm -qa | grep vsftpd 来查看是否安装相应的包 ...

  8. python2/3 利用psycopg2 连接postgreSQL数据库。

    psycopg2 是一个通过python连接postgreSQL的库, 不要被它的名称蒙蔽了,你可能发现它的版本是psyconpg2.7.*, 以为它只能在python2上使用,实际上,这只是一个巧合 ...

  9. 搭建django

    虚拟环境配置 pip install virtualenv 一般需要安装一个管理工具:pip install virtualenvwrapper-win 只有它可以使用workon 创建虚拟环境:mk ...

  10. Linux - rename 批量替换两种模式

    模式一: rename  sub raw  * 模式二: rename  's/sub/raw/g' * sub raw 这里支持一定程序的正则匹配