遇到奇葩面試題了,x !== x 可以為 true ?
前言
最近,我被問到幾個奇怪的面試問題。它們與普通的問題不同:這些面試問題看起來非常簡單,但卻考驗?zāi)銓avaScript的透徹理解。你能正確回答多少個?
x !== x 可以為 true ?
請問當(dāng) 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
(!isNaN(x) && x !== x) 可以為 true?
現(xiàn)在我們排除 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
3.如何讓 x === x + 1
這個問題可能不容易,但只要你了解 JS,你會知道 Number.MAX_SAFE_INTEGER,它表示 常量表示在 JavaScript 中最大的安全整數(shù)(maxinum safe integer)(2^53 - 1)。
所以,我們可以把 Number.MAX_SAFE_INTEGER 賦給 x:
const x = Number.MAX_SAFE_INTEGER + 1
if (x === x + 1) {
console.log('大遷世界')
}
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('大遷世界')
}
真的很神(垃)奇(圾)。
5. typeof x === 'undefined' && x.length > 0
const x = ?
if(typeof x === 'undefined' && x.length > 0) {
console.log('大遷世界')
}
我不得不承認,JS 是一種神奇的語言。除了 undefined 本身,還有什么值可以使 typeof x === undefined 為 true?
答案就是 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)
最后
你還遇到過什么奇葩的面試題,歡迎留言補充!!
作者:fatfish
譯者:前端小智 來源:medium
原文:https://javascript.plnenglish.io/interviewer-can-x-x-return-true-in-javascript-7e1d1a7b5cd