文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript中怎么让x == 1 && x == 2 && x ==3等式成立

2023-07-02 17:20

关注

今天小编给大家分享一下JavaScript中怎么让x == 1 && x == 2 && x ==3等式成立的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前言

某次面试,面试官突然问道:“如何让 x 等于 1 且让 x 等于 2 且让 x 等于 3 的等式成立?

话音刚落,笔者立马失去意识,双眼一黑,两腿一蹬,心里暗骂:什么玩意儿!

虽然当时没回答上来,但觉得这题非常有意思,便在这为大家分享下后续的解题思路:

宽松相等 == 和严格相等 === 都能用来判断两个值是否“相等”,首先,我们要明确上文提到的等于指的是哪一种,我们先看下二者的区别:

(1) 对于基础类型之间的比较,== 和 === 是有区别的:

(2) 对于引用类型之间的比较,== 和 === 是没有区别的,都进行“指针地址”比较 

(3) 基础类型与引用类型之间的比较,== 和 === 是有区别的:

“== 允许在相等比较中进行强制类型转换,而 === 不允许。”

由此可见,上文提到的等于指的宽松相等 ==,题目变为 “x == 1 && x == 2 && x == 3”。

那多种数据类型之间的相等比较又有哪些呢?笔者查阅了相关资料,如下所示:

同类型数据之间的相等比较

null 和 undefined 之间的相等比较

null 和 undefined 之间的 == 也涉及隐式强制类型转换。ES5 规范 11.9.3.2-3 这样定义:

在 == 中,null 和 undefined 相等(它们也与其自身相等),除此之外其他值都不和它们两个相等。

这也就是说, 在 == 中null 和 undefined 是一回事。

var a = null;var  b; a == b; // truea == null; // trueb == null; // truea == false; // falseb == false; // falsea == ""; // falseb == ""; // falsea == 0; // falseb == 0; // false

字符串和数字之间的相等比较

ES5 规范 11.9.3.4-5 这样定义:

var a = 42;var b = "42";a === b; // falsea == b; // true

因为没有强制类型转换,所以 a === b 为 false,42 和 "42" 不相等。

根据规范,"42" 应该被强制类型转换为数字以便进行相等比较。

其他类型和布尔类型之间的相等比较

ES5 规范 11.9.3.6-7 这样定义:

仔细分析例子,首先:

var x = true;var y = "42";x == y; // false

Type(x) 是布尔值,所以 ToNumber(x) 将 true 强制类型转换为 1,变成 1 == "42",二者的类型仍然不同,"42" 根据规则被强制类型转换为 42,最后变成 1 == 42,结果为 false

对象和非对象之间的相等比较

关于对象(对象 / 函数 / 数组)和标量基本类型(字符串 / 数字 / 布尔值)之间的相等比较,ES5 规范 11.9.3.8-9 做如下规定:

什么是 toPrimitive() 函数?

**应用场景:**在 JavaScript 中,如果想要将对象转换成基本类型时,再从基本类型转换为对应的 String 或者 Number,实质就是调用 valueOf 和 toString 方法,也就是所谓的拆箱转换。

**函数结构:**toPrimitive(input, preferedType?)

参数解释:

input 是输入的值,即要转换的对象,必选;

preferedType 是期望转换的基本类型,他可以是字符串,也可以是数字。选填,默认为 number

执行过程:

如果转换的类型是 number,会执行以下步骤:

valueOf 和 toString 的优先级:

由此可知,若 x 为对象时,我们改写 x 的 valueOf 或 toString 方法可以让标题的等式成立:

const x = {  val: 0,  valueOf: () => {    x.val++    return x.val  },}

或者:

const x = {  val: 0,  toString: () => {    x.val++    return x.val  },}

给对象 x 设置一个属性 val 并赋值为 0,并修改其 valueOf、toString 方法,在 “x == 1 && x == 2 && x == 3”判断执行时,每次等式比较都会触发 valueOf、toString 方法,都会执行 val++ ,同时把最新的 val 值用于等式比较,三次等式判断时 val 值分别为 1、2、3 与等式右侧的 1、2、3 相同,从而使等式成立。

JavaScript中怎么让x == 1 && x == 2 && x ==3等式成立

以上就是“JavaScript中怎么让x == 1 && x == 2 && x ==3等式成立”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯