인터뷰 질문: 'a==1&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?

青灯夜游
풀어 주다: 2023-03-13 20:06:48
앞으로
1577명이 탐색했습니다.

이 기사에서는 "a==1&&a==2&&a==3"을 true로 만드는 방법을 알아보기 위한 고전적인 인터뷰 질문을 공유할 것입니다. 이번 면접 질문을 통해 그 안에 담긴 지식 포인트를 배웠으니, 모두에게 도움이 되었으면 좋겠습니다!

인터뷰 질문: 'a==1&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?

1. 문제 분석

if (a == 1 && a == 2 && a == 3) {
  console.log('Win')
}
로그인 후 복사

코드를 실행하고 콘솔에 Win을 성공적으로 인쇄하는 방법은 무엇입니까?Win?

看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢?

인터뷰 질문: 'a==1&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?

冷静下来,发现一些端倪。

它没说让a同时等于1 2 3。

而且js是单线程运行的。 即使它们写在了一行,那也是从左到右执行的. 所以它们从时空上面就不是同一时期的东西。

既然不是同一时期的东西,那么一个人当然可以是可以成为小孩子,之后成为过成年人,然后变成老年人了。

인터뷰 질문: 'a==1&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?

回到题目,那么我想要让这个条件成立,就需要获取一次a的同时,让它自增1。

二、解决办法

2.1 toString

第一种方法,利用判断过程中的[隐式转换]的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&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?

진정하고 단서를 찾으세요.

a가 동시에 1 2 3이 되도록 놔두라는 뜻은 아닙니다.

그리고 js는 단일 스레드에서 실행됩니다. 한 줄에 쓰더라도 왼쪽에서 오른쪽으로 실행되므로 시공상으로는 같은 시대의 것이 아니다.

같은 시대 사람이 아니니까 당연히 아이가 되고, 어른이 되고, 노인이 될 수 있죠.

인터뷰 질문: 'a==1&&a==2&&a==3'을 true로 만드는 방법은 무엇입니까?

돌아가기 topic , 이 조건이 true가 되려면 한 번을 얻어 1씩 증가시켜야 합니다.

두 번째 해결책

2.1 toString

첫 번째 방법은 판단 과정에서 [hidden]을 사용하는 것입니다. toString 변환 방법]. 내 다른 기사에서 왜[ ] = = ![] 결과가 사실인가요? 자세히 설명되어 있습니다.

Object.defineProperties(window, {
  _a: {
    value: 0,
    writable: true
  },
  a: {
    get: function() {
      return  ++_a
    }
  }
})
로그인 후 복사
🎜한 번 실행하고 _a에 1을 더한 다음 반환합니다.🎜🎜toString이 Object.prototype 위의 기본 메서드이므로 이 메서드는 일반적인 암시적 변환 toString 메소드가 차단됩니다. 🎜🎜🎜프로토타입 및 프로토타입 체인과 관련된 지식🎜🎜🎜문제는 해결될 수 있습니다. 🎜🎜댓글란에 있는 일부 친구들은 a = true로 설정해도 문제가 해결될 수 있다고 말했습니다. 실제로 매우 오해의 소지가 있습니다. 실제로 이는 암시적 변환의 우선순위를 혼동합니다. 간단히 말해서 암시적 변환은 🎜변환 규칙 + 변환을 트리거하는 조건🎜의 두 부분으로 구성됩니다. <code>if 패키지는 Boolean()의 변환 규칙을 전체적으로 트리거하고 == 문자열은 toString(()을 트리거합니다. )의 변환 규칙입니다. 🎜🎜이 질문으로 돌아가서 ==의 오른쪽은 숫자이고, JS 실행 라인은 왼쪽에서 오른쪽입니다. 따라서 이때 발생하는 것은 Number()의 규칙이다. 왼쪽의 true1로 변환한 후, 양측이 동일할 것입니다🎜 그러면 당연히 더 이상 규칙이 트리거되지 않으며 더 이상 암시적 변환을 구성하지 않습니다. 따라서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!