遇到奇葩面试题了,x !== x 可以为 true ?

开发 前端
虽然看起来不太可能,一个值怎么可能大于它自己呢?但是,我们可以使用 Symbol.toPrimitive功能来完成这个问题。

前言

最近,我被问到几个奇怪的面试问题。它们与普通的问题不同:这些面试问题看起来非常简单,但却考验你对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

(!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

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('大迁世界')
}

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

责任编辑:武晓燕 来源: 大迁世界
相关推荐

2023-08-13 16:17:31

2018-07-20 09:24:27

Java面试垃圾收集

2020-06-04 14:40:40

面试题Vue前端

2021-06-09 07:56:51

JvmJVM面试题Java

2023-11-13 07:37:36

JS面试题线程

2011-03-24 13:27:37

SQL

2015-09-02 09:32:56

java线程面试

2014-09-19 11:17:48

面试题

2009-06-06 18:36:02

java面试题

2009-06-06 18:34:05

java面试题

2018-03-08 18:40:47

Java百度面试题

2013-05-29 10:23:36

Android开发移动开发Java面试题

2009-06-16 14:03:16

Hibernate面试Hibernate面试

2020-11-05 10:01:35

系统设计软件

2021-02-23 12:43:39

Redis面试题缓存

2023-07-14 08:12:21

计时器unsafecontext

2013-01-05 14:51:34

JavaScriptjQuery面试

2024-06-04 14:52:28

2014-07-28 14:00:40

linux面试题

2015-07-13 09:45:32

阿里校招
点赞
收藏

51CTO技术栈公众号