面試官:x !== x 可以為 true ?

前端小智發表於2022-05-17
作者:fatfish
譯者:前端小智
來源:medium

有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。

前言

最近,我被問到幾個奇怪的面試問題。它們與普通的問題不同:這些面試問題看起來非常簡單,但卻考驗你對JavaScript的透徹理解。你能正確回答多少個?

x !== x 可以為 true ?

請問當 x 值為什麼時,才會列印 大遷世界

const x = ? // ??
if (x !== x) {
  console.log('大遷世界')
}

奇怪,到底有什麼值是不等於自身的嗎?在 JS 中確實有一個值 NaN,它不等於任何值,甚至不等於自己。

const x = NaN 
if (x !== x) {
  console.log('大遷世界')
}
console.log(NaN === NaN) // false
console.log(x !== x) // true
console.log(Number.isNaN(x)) // true

image.png

(!isNaN(x) && x !== x) 可以為 true?

現在我們排除 NaN,那麼還有什麼值可以不等於它自身的?

const x = ? 
if(!isNaN(x) && x !== x) {
  console.log('hello fatfish')
}
view rawq2-1.js hosted with 

也許你知道 object. Defineproperty,它可以幫助我們解決這個問題。

window.x = 0 
Object.defineProperty(window, 'x', {
  get () {
    return Math.random()
  }
})
console.log(x) // 0.12259077808826002
console.log(x === x) // false
console.log(x !== x) // true

image.png

3.如何讓 x === x + 1

這個問題可能不容易,但只要你瞭解 JS,你會知道 Number.MAX_SAFE_INTEGER,它表示 常量表示在 JavaScript 中最大的安全整數(maxinum safe integer)(2^53 - 1)。

所以,我們可以把 Number.MAX_SAFE_INTEGER 賦給 x:

const x =  Number.MAX_SAFE_INTEGER + 1 
if (x === x + 1) {
  console.log('大遷世界')
}

image.png

4. x > x 可以為 true?

我不想再讀了,這是什麼垃圾問題?

const x = ? 
if (x > x) {
  console.log('hello fatfish')
}

雖然看起來不太可能,一個值怎麼可能大於它自己呢?但是,我們可以使用 Symbol.toPrimitive功能來完成這個問題。

const x = {
  value: 1,
  [ Symbol.toPrimitive ] () {
    console.log('x', this.value)
    return --this.value
  }
}

if (x > x) {
  console.log('大遷世界')
}

image.png

真的很神(垃)奇(圾)。

5. typeof x === 'undefined' && x.length > 0

const x = ? 
if(typeof x === 'undefined' && x.length > 0) {
  console.log('大遷世界')
}

我不得不承認,JS 是一種神奇的語言。除了 undefined 本身,還有什麼值可以使 typeof x === undefinedtrue

答案就是 document.all,它表示頁面上的所有元素。

const x = document.all 
if(typeof x === 'undefined' && x.length > 0) {
  console.log('大遷世界')
}

console.log(x)
console.log(typeof x)
console.log(x === undefined)

image.png

最後

你還遇到過什麼奇葩的面試題,歡迎留言補充!!


編輯中可能存在的bug沒法實時知道,事後為了解決這些bug,花了大量的時間進行log 除錯,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug

原文:https://javascript.plnenglish...

交流

有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。

相關文章