이 기사에서는 "a==1&&a==2&&a==3"을 true로 만드는 방법을 알아보기 위한 고전적인 인터뷰 질문을 공유할 것입니다. 이번 면접 질문을 통해 그 안에 담긴 지식 포인트를 배웠으니, 모두에게 도움이 되었으면 좋겠습니다!
if (a == 1 && a == 2 && a == 3) { console.log('Win') }
코드를 실행하고 콘솔에 Win
을 성공적으로 인쇄하는 방법은 무엇입니까?Win
?
看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢?
冷静下来,发现一些端倪。
它没说让a同时等于1 2 3。
而且js是单线程运行的。 即使它们写在了一行,那也是从左到右执行的. 所以它们从时空上面就不是同一时期的东西。
既然不是同一时期的东西,那么一个人当然可以是可以成为小孩子,之后成为过成年人,然后变成老年人了。
回到题目,那么我想要让这个条件成立,就需要获取一次a的同时,让它自增1。
第一种方法,利用判断过程中的[隐式转换]的toString
方法。在我的另外一篇为什么[] == ![]结果为true?中详细阐述过。
const a = { _a: 0, toString: function() { return ++a._a } }
运行一次,就给_a加1,然后返回.
因为toString是Object.prototype
上面默认的方法,所以这个办法相当于把正常的隐式转换中toString
方法给拦截了。
涉及原型和原型链的知识点
问题是可以解决了。
评论区的有掘友说让 a = true 也可以解决的。确实很有误导性。其实是混淆了隐式转化的优先级。简单来说,隐式转化是由两部分组成:转化的规则 + 触发转化的条件。if
包着的里面整体触发了Boolean()
的转化规则,==
又字符串在右侧触发toString()
的转化规则。
回到这题,==
的右边是数字,JS运行线路是从左到右的。所以,这个时候触发的是Number()
的规则,把左侧的true
转化为1
之后,两边类型一致之后,那自然不会再触发什么规则了,此时已经不构成隐式转化。所以说1 == 1 && 1 == 2 && 1 == 3
是不成立的。
现在记住了,也比面试过程中的时候再来记好
现在将题目简单修改一下,将双等变成三个等怎么办?
大家都知道===
的话是先判断类型,再判断值。这里的toString
已经默认把对象转化为字符串了.使用toStirng
a가 동시에 1 2 3이 되도록 놔두라는 뜻은 아닙니다.
같은 시대 사람이 아니니까 당연히 아이가 되고, 어른이 되고, 노인이 될 수 있죠.그리고 js는 단일 스레드에서 실행됩니다. 한 줄에 쓰더라도 왼쪽에서 오른쪽으로 실행되므로 시공상으로는 같은 시대의 것이 아니다.
2.1 toString
첫 번째 방법은 판단 과정에서 [hidden]을 사용하는 것입니다. toString
변환 방법]. 내 다른 기사에서 왜[ ] = = ![] 결과가 사실인가요? 자세히 설명되어 있습니다.
Object.defineProperties(window, { _a: { value: 0, writable: true }, a: { get: function() { return ++_a } } })
Object.prototype
위의 기본 메서드이므로 이 메서드는 일반적인 암시적 변환 toString 메소드가 차단됩니다. 🎜🎜🎜프로토타입 및 프로토타입 체인과 관련된 지식🎜🎜🎜문제는 해결될 수 있습니다. 🎜🎜댓글란에 있는 일부 친구들은 a = true로 설정해도 문제가 해결될 수 있다고 말했습니다. 실제로 매우 오해의 소지가 있습니다. 실제로 이는 암시적 변환의 우선순위를 혼동합니다. 간단히 말해서 암시적 변환은 🎜변환 규칙 + 변환을 트리거하는 조건🎜의 두 부분으로 구성됩니다. <code>if
패키지는 Boolean()
의 변환 규칙을 전체적으로 트리거하고 ==
문자열은 toString(()을 트리거합니다. )
의 변환 규칙입니다. 🎜🎜이 질문으로 돌아가서 ==
의 오른쪽은 숫자이고, JS 실행 라인은 왼쪽에서 오른쪽입니다. 따라서 이때 발생하는 것은 Number()
의 규칙이다. 왼쪽의 true
를 1
로 변환한 후, 양측이 동일할 것입니다🎜 그러면 당연히 더 이상 규칙이 트리거되지 않으며 더 이상 암시적 변환을 구성하지 않습니다. 따라서 1 == 1 && 1 == 2 && 1 == 3
은 사실이 아닙니다. 🎜🎜🎜이제 외웠으니 면접때 외우는 것보다 낫네요🎜🎜🎜이제 문제만 수정해서 더블에서 트리플 등으로 바꿔보겠습니다. 어떻게 해야 하나요? 🎜🎜===
가 유형을 먼저 결정한 다음 값을 결정한다는 것은 누구나 알고 있습니다. 여기서 toString
은 기본적으로 개체를 문자열로 변환합니다. toStirng
를 사용하면 결과가 true가 아닙니다. 🎜🎜🎜2.2 DefineProperties🎜🎜🎜 데이터 가로채기 방법 :🎜rrreee🎜객체 접근자 관련 콘텐츠🎜🎜🎜Vue에서 시계나 계산된 명령을 연상시키는지 궁금합니다. 🎜🎜🎜🎜3.요약🎜🎜🎜이 면접 질문을 할 수 있는지 여부는 의미가 없습니다. 하지만 이 인터뷰 질문에 포함된 지식 포인트를 이해하는 것은 매우 흥미롭습니다. 🎜🎜암시적 유형 변환부터 프로토타입 및 프로토타입 체인, 그리고 마지막으로 객체의 액세스 권한 속성까지. 계속해서 확장하고 싶다면 Vue의 양방향 바인딩 구현 원칙, 클래스 내 정적 구현 등을 참조하세요. 🎜🎜한 지식 포인트에서 다른 관련 지식 포인트로 확장할 수 있는 프론트 엔드 지식 시스템 구축이 필요하다고 말하는 이유입니다. 🎜🎜【추천 학습: 🎜javascript 고급 튜토리얼🎜】🎜위 내용은 인터뷰 질문: 'a==1&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!