奇怪的问题 a==1 a==2 a==3

a == 1 && a == 2 && a == 3

题目很简单,只要让if语句中的判断条件成立即可。

if (a == 1 && a == 2 && a == 3) {console.log('win!!!');
}

首先分析题目,题目的意思只要我们能够让a同时与1,2,3相等的话,那么此时就成功了。很显然此时a并不能只是一个普通的值,因为如果a只是一个普通值的话,它是没有办法做到同时与三个值相同的。这条思路行不通,我们需要再想想其它的方法。
其实我们可以从==运算符下手,提到 == 我们可以联想到隐式类型转换,那么我们可不可以通过隐式类型转换来处理这道题呢,分析一下。
既然牵扯到隐式类型转换,无非就存在下面几种转换的规则:

  1. toPrimitive()Symbol.toPrimitive => valueOf => toString

将值转为原始值(原始类型)

  1. toNumber()Symbol.toPrimitive => valueOf => toString

将值转为数字

  1. toString()Symbol.toPrimitive => toString => valueOf

将值转为字符串
熟悉完规则后,我们再来看看题目。虽然a不能是原始值,但是我们可以将a设置为一个对象的形式,当对象与数值进行==运算的时候,是会执行toPrimitive规则的隐式转换逻辑。

var a = {step: 0,toString() {return ++this.step; }
}
if (a == 1 && a == 2 && a == 3) {console.log('win');
}

a === 1 && a === 2 && a === 3

那么如果替换稍微变换的话,那么我们又该如何操作呢?刚刚是==运算符,是存在隐式转换的问题。而如果此时是===严格相等的话,那么就不存在隐式转换的问题。那么我们又该如何设计呢?
既然现在的情况是不存在隐式转换的问题,那么我们就没有办法通过valueof/toString方法去解决这个问题了,因为此时是不会调用toString、valueof方法。
我们再次分析if(a === 1 && a === 2 && a === 3)题目,当在执行a === 1的时候,程序是要去访问a的值,这样才能够进行对比。既然存在访问a这个操作,那么我们是不是可以通过数据劫持的方式来对a值进行处理呢?

if (a === 1 && a === 2 && a === 3) {console.log('win!!!');
}

如果用到数据劫持的话,我们可以使用Object.defineProperty()方法来处理。但是defineProperty是需要在对象上定义属性,而我们的a属性放在哪里比较合适呢?当然是存放在window对象上比较合适。所以我们可以这样去做:

var step = 0;
Object.defineProperty(window, 'a', {get () {return ++step;}
});
if (a === 1 && a === 2 && a === 3) {console.log('win!!!');
}

再次改变一下题目,如果题目换为下面的方式,又该如何操作呢?

if (obj.a === 1 && obj.a === 2 && obj.a === 3) {console.log('win!!!');
}

很简单,也是数据劫持。但是我们可以不用defineProperty对象定义属性的方式去做,我们可以直接在对象中通过语法糖的方式进行处理。比如说像下面一样去做:
get、set函数是直接可以写在对象内部中去。

var obj = {_step: 0,get a() {return ++ this._step;}
}if (obj.a === 1 && obj.a === 2 && obj.a === 3) {console.log('win!!!');
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电路笔记】-快速了电阻

电阻类型 文章目录 电阻类型1、概述2、电阻器的组成类型2.1 碳电阻器2.2 薄膜电阻器2.3 绕线电阻器 3、总结 电阻器是所有电子元件中最基本、最常用的元件,人们几乎认为电阻器是理所当然的,但它们在电路中起着至关重要的作用。 1、概述 有许多不同类型的…

SpringCloud之Gateway(统一网关)

文章目录 前言一、搭建网关服务1、导入依赖2、在application.yml中写配置 二、路由断言工厂Route Predicate Factory三、路由过滤器 GatewayFilter案例1给所有进入userservice的请求添加一个请求头总结 四、全局过滤器 GlobalFilter定义全局过滤器,拦截并判断用户身…

深入解析:如何开发抖音票务小程序

当下,开发抖音票务小程序成为了吸引年轻用户群体的一种创新方式。本文将深入解析如何开发抖音票务小程序,探讨关键步骤和技术要点。 1.确定需求和功能 考虑到抖音的用户特点,可以加入与短视频相关的票务功能,如在线购票、观影记录…

[网络] 3. HTTP 3 与 HTTP 2 有什么区别

协议不同 HTTP2 是基于 TCP 协议实现的 HTTP3 是基于 UDP 协议实现的QUIC HTTP3 新增了 QUIC 协议来实现可靠性的传输握手次数 HTTP2 是基于 HTTPS 实现的,建立连接需要先进行 TCP 3次握手,然后再进行 TLS 3次握手,总共6次握手。 HTTP3 只需要…

IDEA中的Postman?完全免费!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

Jenkins用126邮箱发邮件为什么发不出去

1、检查 Jenkins Location中的邮件地址配置与发邮件的地址配置是否一致 Manage Jenkins -》 system 2、检查地址和端口号 3、检查邮箱的登录配置是否正确(这个地方的配置方式网上一抓一大把,自己搜一下就好) 4、126邮箱发邮件不需要勾选ssl协…

在浏览器中直接打开PDF

1 使用iframe标签 <iframe src"./test.pdf" height"900px;" width"800px"></iframe> 如果PDF是base64参考如下 <iframe id"pdfView" width"100%" height"100%" allow"fullscreen" typ…

Blender学习--模型贴图傻瓜级教程

Blender 官方文档 1. Blender快捷键&#xff1a; 快捷键说明 按住鼠标滚轮&#xff1a;移动视角Tab&#xff1a;切换编辑模式和物体模式鼠标右键&#xff1a; 编辑模式&#xff1a; 物体模式&#xff1a; 其他&#xff1a; 2. 下面做一个球体贴一张纹理的操作 2.1 效果如下…

A-莲子的软件工程学【算法必会题目】(JavaPythonC++实现)

文章目录 A-莲子的软件工程学题目背景解题思路Python题解代码Java题解代码C++题解代码代码OJ评判结果代码讲解Python 代码解释:Java 代码解释:C++ 代码解释:寄语A-莲子的软件工程学 题目背景 在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。 对于一名…

VM虚拟机中Ubuntu14.04安装VM tools后仍不能全屏显示

1、查看Ubuntu所支持的分辨率大小。 在终端处输入&#xff1a; xrandr&#xff0c;回车 2、输入你想设置的分辨率参数。 我设置的为1360x768&#xff0c;大家可以根据自己的具体设备设置。 在终端输入&#xff1a;xrandr -s 1360x768 注意&#xff1a;这里1360后边是字母 x 且…

Selenium-介绍下其他骚操作

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…

交叉编译 和 软硬链接 的初识(面试重点)

目录 交叉编译的初认识Q&A Q1: 编译是什么&#xff1f; Q2: 交叉编译是什么&#xff1f; Q3: 为什么要交叉编译 Q3.1&#xff1a;树莓派相对于C51大得多&#xff0c;可以集成编译器比如gcc&#xff0c;那么树莓派就不需要交叉编译了吗&#xff1f; Q4: 什么是宿主机和…

鸿蒙HarmonyOS 编辑器 下载 安装

好 各位 之前的文章 注册并实名认证华为开发者账号 我们基实名注册了华为的开发者账号 我们可以访问官网 https://developer.harmonyos.com/cn/develop/deveco-studio 在这里 直接就有我们编辑器的下载按钮 我们直接点击立即下载 这里 我们根据自己的系统选择要下载的系统 例…

Android:Google三方库之集成应用内评价详细步骤

1、集成依赖 implementation("com.google.android.play:review:2.0.1")implementation("com.google.android.play:review-ktx:2.0.1") 2、创建 ReviewManager 请遵循有关何时请求应用内评价的指南&#xff0c;以确定在应用的用户流的哪些阶段适合提示用户…

Unsupervised MVS论文笔记(2019年)

Unsupervised MVS论文笔记&#xff08;2019年&#xff09; 摘要1 引言2 相关工作3 实现方法3.1 网络架构3.2 通过光度一致性学习3.3 MVS的鲁棒光度一致性3.4 学习设置和实施的细节3.5.预测每幅图像的深度图 4 实验4.1 在DTU上的结果4.2 消融实验4.3 在ETH3D数据集上的微调4.4 在…

大数据平台测试-一次生产P2故障记录

项目介绍&#xff1a;某鉴权项目。公司为了数据安全&#xff0c;去年评审通过了一个基于中间件kafka的鉴权项目&#xff0c;大概的意思&#xff0c;消费topic的应用需要对接鉴权项目&#xff0c;订阅应用&#xff0c;启动端口9093消费&#xff08;默认是9092端口&#xff09;&a…

电力感知边缘计算网关产品设计方案-网关软件设计方案

网关采用网络协议和软件技术在通信网络中针对工业协议、互联网通用协议进行分析和记录,提升工业控制系统环境的安全防护能力。A类和B类网关采用容器技术的软件架构,采用C/S架构软件客户端提供应用软件平台,为管理员提供功能丰富的图形管理控制界面。 因A类和B类网关在产品定…

按需引入 ElMessage,没有样式且类型检查失败

文章目录 ElMessage 弹框没有样式问题描述解决方案 ts 类型检查失败问题描述解决办法 eslint 检查失败问题描述解决办法 ElMessage 弹框没有样式 问题描述 Element-plus 在使用 ElMessage 消息弹框的时候没有样式&#xff0c;按照官方的按需加载的方式引入的 import { ElMes…

AIGC ChatGPT4总结Linux Shell命令集合

在Linux中,Shell命令的数量非常庞大,因为Linux提供了各种各样的命令来处理系统任务。这些命令包括GNU核心工具集、系统命令、shell内置命令以及通过安装获得的第三方应用程序命令。以下是一些常见的Linux命令分类及其示例,但请注意,这不是一个全面的列表,因为列出所有命令…

Dempster-Shafer(D-S)证据理论的基本定义和详细分析,优点,缺点,应用!!(系列1)

文章目录 前言一、D-S证据理论的应用&#xff1a;二、D-S证据理论的优点&#xff1a;三、D-S证据理论的缺陷&#xff1a;四、D-S组合规则&#xff1a;总结 前言 Dempster-Shafer&#xff08;D-S&#xff09;证据理论是一种不精确推理理论&#xff0c;也称为Dempster/Shafer证据…