>웹 프론트엔드 >JS 튜토리얼 >희미한! 인터뷰 질문 console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) 무엇을 출력합니까?

희미한! 인터뷰 질문 console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) 무엇을 출력합니까?

藏色散人
藏色散人앞으로
2023-04-12 15:29:22934검색
이 기사는 주로 console.log에 대한 인터뷰 질문을 공유합니다. 관심 있는 친구들은 아래에서 이 기사를 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.

머리말

인터뷰 질문 console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) 출력은 무엇입니까? 인터뷰 중에 이런 면접 질문을 접했는데, 면접 질문은 유형 변환, 암시적 유형 변환, 연산자 등을 조사했는데, 어떻게 답해야 할지 몰라서 답변을 못 한 것이 아닙니다. 방금 질문을 읽었습니다. 하지만 면접 질문이니까 잘 풀어보세요.

희미한! 인터뷰 질문 console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) 무엇을 출력합니까?

이 문제를 해결하려면 지식이 필요합니다

  • "+": 단항 +는 Number()를 사용하는 것과 동일한 변환을 수행합니다.
  • + 기호가 두 숫자의 추가인 경우 피연산자는 객체이거나 객체입니다. 값 또는 부울인 경우 toString 메서드를 호출하여 문자열로 변환합니다.
  • "!": 연산자가 아니며 이 작업은 항상 부울 값을 반환합니다.
  • "!!": 이 문제를 해결하려면 부울 값으로 강제 변환합니다.

문제 ([] [[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]

먼저 실행 순서를 명확히 해야 합니다.

먼저 ([][[]] + [])를 실행하고, 먼저 내부의 [][[]]를 실행한 다음 [ ][[]], 실제로는 [] 빈 배열의 [] 키를 사용하여 값을 실행합니다([][[]] + []),先执行里面的[][[]],在计算 [][[]]时,其实就是执行[]空数组里面key为[]的值

  1. 首先,JavaScript 引擎解析空数组 []。空数组没有任何元素。
  2. 接下来,引擎尝试使用 [] 作为属性名来访问空数组的属性。在这种情况下,由于 [] 本身是一个数组,JavaScript 引擎会尝试将其转换为字符串。由于 [] 为空数组,转换成字符串后结果为一个空字符串 ""
  3. 最后,引擎会尝试访问空数组中名为 "" 的属性。由于这个属性并不存在于空数组中,所以结果为 undefined

所以,执行 [][[]] 的结果是 undefined

那么([][[]] + [])接下去执行就是(undefined + []) 将会执行隐式类型转换,将undefined转换为字符串"undefined",将[]转为“”,然后将两个字符串拼接在一起。因此,结果是"undefined"

其次执行[+!![]],!![]空数组转布尔值为true,一元操作服+会转为数值,+true就是将true转换为数字1。得到的结果就是[1]。于是我们就可以得到([][[]] + [])[+!![]]undefined[1]这个的结果就是字符串'n'

接下来就是执行([]+{})[+!![]+ + !![]] 这一部分,再将这部分的结果和上面的结果相加

  1. 先执行([]+{}),  计算[]+{}。这将触发隐式类型转换,将空对象转换为字符串"[object Object]",然后将两个字符串拼接在一起。因此,结果是'[object Object]'

  2. 再执行[+!![]+ + !![]], +!![]前面有解析过得到的是1,所以这一部分执行过后得到的是数值1相加1+1,得到的结果是[2]

  3. 那么这两部分合起来就是'[object Object]'[2],就是字符串的第三个值b

最后将前面部分得到的结果 'n' 和后面部分得到的结果 'b' 相加,得到最后的结果'nb'

总结:这个题目一时解决不了的话,可能有以下几个原因,第一个就是不太清楚执行顺序,其次就是不太理解[][[]]这个,实际上就是获取空数组key为[]的值,又因为数组的key为字符串,所以会将[]转为''

    먼저 JavaScript 엔진은 빈 배열 []를 구문 분석합니다. >. 빈 배열에는 요소가 없습니다.

    다음으로 엔진은 []를 속성 이름으로 사용하여 빈 배열의 속성에 액세스하려고 시도합니다. 이 경우 [] 자체가 배열이므로 JavaScript 엔진은 이를 문자열로 변환하려고 시도합니다. []는 빈 배열이므로 문자열로 변환한 후의 결과는 빈 문자열 ""입니다.
    마지막으로 엔진은 빈 배열에 있는 "" 속성에 액세스하려고 시도합니다. 이 속성은 빈 배열에 존재하지 않으므로 결과는 정의되지 않음입니다.

그래서 [][[]]를 실행한 결과는 정의되지 않았습니다입니다. 🎜🎜그러면 ([][[]] + [])의 다음 실행은 암시적 유형 변환을 수행하고 를 변환하는 <code>(undefine + [])입니다. 정의되지 않음을 "undefine" 문자열로 변환하고, []를 ""로 변환한 다음 두 문자열을 함께 연결합니다. 따라서 결과는 "정의되지 않음"🎜🎜🎜그런 다음 [+!![]]을 실행하면 !![] 빈 배열이 부울 값 true로 변환되고, 단항 연산 서비스 +는 숫자 값으로 변환되고, +true는 true를 숫자 1로 변환합니다. 결과는 [1]입니다. 따라서 ([][[]] + [])[+!![]]undefine[1]으로 얻을 수 있습니다. 결과는 입니다. 'n'🎜🎜🎜다음 단계는 ([]+{})[+!![]+ + !![]]를 실행한 다음 추가하는 것입니다. 이 부분의 결과를 위의 결과로🎜
    🎜🎜먼저 ([]+{})를 실행하고 []+{}를 계산하세요. 이는 암시적 유형 변환을 트리거하여 빈 개체를 문자열 "[object Object]"로 변환한 다음 두 문자열을 함께 연결합니다. 따라서 결과는 '[object Object]'입니다. 🎜🎜🎜🎜Execute [+!![]+ + !![]] 다시, +!![]는 이전에 파싱되어 1을 얻었으므로 이 부분을 실행한 후 얻은 값은 숫자 값 1+1에 1을 더하면 [2]가 됩니다. 🎜🎜🎜🎜그러면 결합된 두 부분은 '[object Object]'[2]이며, 이는 문자열의 세 번째 값 b입니다🎜🎜
🎜마지막으로 이전 부분을 얻습니다. 나중에 얻은 결과 'b''n' 결과를 ​​더해 최종 결과 'nb'🎜🎜요약 : 이 질문이 현재 해결되지 않는다면 여러 가지 이유가 있을 수 있습니다. 첫째는 실행 순서가 명확하지 않은 것이고, 둘째는 [][[]]가 아니기 때문입니다. 실제로는 []의 값으로 빈 배열 키를 얻는 것으로 이해되며, 배열의 키는 문자열이므로 []를 다음과 같이 변환합니다. ''이므로 찾을 수 없습니다. 정의되지 않은 상태를 반환합니다. 이제 이 면접 질문을 아시나요? 🎜🎜추천 학습: "🎜웹 프론트 엔드 개발 비디오 튜토리얼🎜"🎜🎜🎜

위 내용은 희미한! 인터뷰 질문 console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) 무엇을 출력합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제