网站首页 > 技术文章 正文
JS中(a==1 && a==2 && a==3)可以在JavaScript中计算为“true”吗?
nanyue 2024-10-16 11:04:49 技术文章 12 ℃概述:最近,我被问到一个非常有趣的面试问题:(a== 1 && a==2 && a==3)能否在 JavaScript 中计算为 true? 我差点失去了工作机会,因为我无法回答。那一刻,我被这个问题吓了一跳,以为面试官在开玩笑。
最近,我被问到一个非常有趣的面试问题:(a== 1 && a==2 && a==3)能否在 JavaScript 中计算为 true? 我差点失去了工作机会,因为我无法回答。
那一刻,我被这个问题吓了一跳,以为面试官在开玩笑。
但当我看到他的“微笑”时,一种**“你一定不知道答案”**的感觉在我脑海中闪过。这绝对不是一个容易解决的问题。
本文将给出6个专业的答案。让我们马上开始吧。
解决方案 1:valueOf && toString
第一个解决方案非常简单,我相信一旦你读完这段代码,你就会有一个想法。
太神奇了,这是怎么回事? 别担心,我的朋友,我会尽力解释原因。
解释部分隐式转换规则
在 JavaScript 中用于比较两个值时,将执行以下操作:==
- 将两个比较的值转换为相同的类型。
- 转换后(可以转换等式的一侧或两侧),比较值。
对比规则如下表所示:
可以从表中获得一些信息。为了使(),a只能是以下几种情况:a == 1
- 的类型为 String,可以转换为数字 1 ()。a'1' == 1 => true
- 的类型是布尔值,可以转换为数字 1 ()。atrue == 1 => true
- 的类型是 Object,可以通过“转换机制”转换为数字 1。a
对象到原始类型的“转换机制”
规则 1 和规则 2 没有什么特别之处。让我们看一下 3:
当对象转换为原始类型时,将调用内置的 [ToPrimitive] 函数。逻辑大致如下:
- 如果有方法,请先调用它,否则 2.Symbol.toPrimitive
- 调用,如果可以转换为原始类型,则返回,否则valueOf
- 调用 ,如果可以转换为原始类型,则返回,否则返回 4.toString
- 如果未返回原始类型,则会报错。
我的朋友,谢谢你非常有耐心,阅读了很长时间,我相信你心里已经有答案了。
解决方案 2:阵列和联接(&)
数组对象的隐式转换也符合规则 3,但 'join' 方法将在 “toString” 之前调用。所以你可以从这里开始。
解决方案 3:使用“with”运算符
MDN 有一个关于使用 的警告,好像它的存在是一个错误。我从未在工作中使用它,但它可以用来解决这个问题。with
你太聪明了,你甚至不需要我解释代码的含义。
解决方案 4:Symbol.toPrimitive
我们可以使用隐式转换规则 3 来完成问题(看完答案,你就会知道为什么了!
数据劫持也是一种出路
通过隐式转换,我们做了 3 个让 return 成真的答案,你一定想到了另一个答案,伟大的 Vue 我们用它来赢得数百万开发者的心,我们也尝试用它来解决这个面试问题。a == 1 && a == 2 && a == 3data hijacking
解决方案 5:Object.defineProperty
通过劫持 'window' 对象,每次读取 'a' 属性时,_ a 都会加 1。
解决方案 6:代理
还有另一种劫持数据的方法,Vue3 也用 .Object.definePropertyProxy
猜你喜欢
- 2024-10-16 JavaScript 的这个难点,毁掉了多少程序员
- 2024-10-16 前端开发之彻底搞懂this指向(前端this指向问题)
- 2024-10-16 JavaScript中的变量声明和作用域(一)
- 2024-10-16 Top 26 JavaScript面试问题和答案
- 2024-10-16 JS 经典实例知识点整理汇总【实践】
- 2024-10-16 苦恼于JavaScript中的reduce函数?五分钟讲透彻
- 2024-10-16 前端基础:JavaScript(前端基础题)
- 2024-10-16 一句话彻底理解JS中的回调(Callback)函数
- 2024-10-16 面试中被问到最多的 19 个 JavaScript 问题
- 2024-10-16 JavaScript 中的特殊数值有哪些?(javascript有哪些常用的属性和方法)
- 06-13C++之类和对象(c++中类和对象的区别)
- 06-13C语言进阶教程:数据结构 - 哈希表的基本原理与实现
- 06-13C语言实现见缝插圆游戏!零基础代码思路+源码分享
- 06-13Windows 10下使用编译并使用openCV
- 06-13C语言进阶教程:栈和队列的实现与应用
- 06-13C语言这些常见标准文件该如何使用?很基础也很重要
- 06-13C语言 vs C++:谁才是编程界的“全能王者”?
- 06-13C语言无锁编程指南(c语言锁机代码)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)